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

时间:2017-12-24 06:22:21

标签: mysql sql

我正在创建一个网络应用,让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. 的收据表中选择收据
  3. 插入从步骤1获取的收据以及分配了收据的用户。
  4. 更新收据状态(0-> 1或1-> 2)
  5. 这就是我计划达到上述要求的方式。

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

    如何确保不会发生这种情况?

1 个答案:

答案 0 :(得分:2)

出于所有目的,请使用transactions

String.valueOf(n).contains("1")

交易要么让所有的报表都执行,要么根本不执行,并且在更新的行上隐式执行锁定,这比第二种方法更有效

您也可以使用LOCK TABLE

执行此操作