我正在创建一个Web应用程序,允许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的收据并将其分配给另一个不符合要求的用户。
我怎样才能确保不会发生这种情况?
出于所有目的,使用transactions
:
START TRANSACTION
your SQL commands
COMMIT
事务要么让所有语句执行,要么根本不执行,并且隐式执行对更新行的锁定,这比第二种方法更有效
你也可以用LOCK TABLE来做