我正在创建一个网络应用,让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个用户
这就是我计划达到上述要求的方式。
这种方法的问题在于,可能有可能在执行更新(步骤3)之前执行select(step1)。 如果发生这种情况,可能会获取状态为2的收据并将其分配给另一个不符合要求的用户。
如何确保不会发生这种情况?
答案 0 :(得分:2)
出于所有目的,请使用transactions
:
String.valueOf(n).contains("1")
交易要么让所有的报表都执行,要么根本不执行,并且在更新的行上隐式执行锁定,这比第二种方法更有效
您也可以使用LOCK TABLE
执行此操作