MySQL:如何确保在选择之前始终执行更新?

问题描述 投票:0回答:1

我正在创建一个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个用户

  1. 从收据表中选择状态不等于“2”的收据
  2. 插入从步骤1获取的收据以及分配了收据的用户。
  3. 更新收据状态(0-> 1或1-> 2)

这就是我计划达到上述要求的方式。

这种方法的问题在于,可能有可能在执行更新(步骤3)之前执行select(step1)。如果发生这种情况,可能会获取状态为2的收据并将其分配给另一个不符合要求的用户。

我怎样才能确保不会发生这种情况?

mysql sql
1个回答
2
投票

出于所有目的,使用transactions

START TRANSACTION
   your SQL commands
COMMIT

事务要么让所有语句执行,要么根本不执行,并且隐式执行对更新行的锁定,这比第二种方法更有效

你也可以用LOCK TABLE来做

© www.soinside.com 2019 - 2024. All rights reserved.