我正在创建一个网络应用程序,允许 N 个用户输入收据数据。
向用户提供一组扫描收据,但处理同一张收据的用户不得超过 2 个。
即用户A和用户B可以处理收据-1,但用户C不能处理它(另一个收据,比如收据-2,应该分配给用户C)。
我使用的表结构类似于以下内容。
[用户收据表]
+------------+--------------+
| user_id | receipt_id |
+------------+--------------+
| 000000001 | R0000000000 |
| 000000001 | R0000000001 |
| 000000001 | R0000000002 |
| 000000002 | R0000000000 |
| 000000002 | R0000000001 |
+------------+--------------+
[收据表]
+-------------+--------+
| receipt_id | status |
+-------------+--------+
| R0000000000 | 0 |
| R0000000001 | 1 |
| R0000000002 | 0 |
| R0000000003 | 2 |
+-------------+--------+
★状态 0:未分配 1:分配给一个用户 2:分配给 2 个用户
- 从收据表中选择状态不等于“2”的收据
- 插入从第 1 步获取的收据以及分配了收据的用户。
- 更新收货状态(0->1 或 1->2)
这就是我计划实现上述要求的方式。
这种方法的问题在于,select(step1)有可能在update(step3)执行之前执行。 如果发生这种情况,状态为 2 的收据可能会被获取并分配给其他用户,这不符合要求。
如何确保这种情况不会发生?
最佳答案
出于所有目的,请使用 transactions
:
START TRANSACTION
your SQL commands
COMMIT
事务要么让所有语句执行,要么根本不执行,并在更新的行上隐式执行锁定,这比第二种方法更有效
您还可以使用 LOCK TABLE 来完成此操作
关于MySQL:如何确保更新始终在选择之前执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47958506/