繁体   English   中英

MySQL中具有REPEATABLE READ隔离级别的更新插入

[英]Update-Insert in MySQL with REPEATABLE READ Isolation level

我有一个要在MYSQL中执行更新插入的步骤(我必须使用REPEATABLE-READ隔离级别)。场景是-

there is a table -
+----+--------+--------+--------+
| ID |  NAME  | AMOUNT | STATUS |
+----+--------+--------+--------+
|  1 |  NAME1 |  700   | ACTIVE |
+----+--------+--------+--------+

现在,NAME = NAME1的每个新条目都应使用STATUS = INACTIVE更新旧条目,然后应插入新条目,即

+----+--------+--------+----------+
| ID |  NAME  | AMOUNT |  STATUS  |
+----+--------+--------+----------+
|  1 |  NAME1 |  700   | INACTIVE |
+----+--------+--------+----------+
|  2 |  NAME1 |  800   |  ACTIVE  |
+----+--------+--------+----------+

如果两个事务要插入新条目(一个AMOUNT = 800,第二个AMOUNT = 900),则应将旧条目标记为INACTIVE,然后插入新条目。 因此表的最终输出(第一个实例)应为

+----+--------+--------+----------+
| ID |  NAME  | AMOUNT |  STATUS  |
+----+--------+--------+----------+
|  1 |  NAME1 |  700   | INACTIVE |
+----+--------+--------+----------+
|  2 |  NAME1 |  800   | INACTIVE |
+----+--------+--------+----------+
|  3 |  NAME1 |  900   |  ACTIVE  |
+----+--------+--------+----------+

显然,将存在争用条件,但是没有问题,结果表应该只包含一个活动记录,用于NAME = NAME1

现在的问题是-两个转换都通过更新已插入的行来插入其记录。 最后,我得到了两个活动记录。 即。

+----+--------+--------+----------+
| ID |  NAME  | AMOUNT |  STATUS  |
+----+--------+--------+----------+
|  1 |  NAME1 |  700   | INACTIVE |
+----+--------+--------+----------+
|  2 |  NAME1 |  800   |  ACTIVE  |
+----+--------+--------+----------+
|  3 |  NAME1 |  900   |  ACTIVE  |
+----+--------+--------+----------+

+--------------------------+-------------------------------+
|   T1                     |             T2                | 
+--------------------------+-------------------------------+ 
|  START                   |    START                      |
|  update entry(ID=1)      | wait for lock on entry(ID=1)  |
|  insert new entry(ID=2)  |                               |
|  commit                  |                               |
|                          | update entry(ID=1)            |
|                          | insert new entry(ID=3)        |
|                          | commit                        |
+--------------------------+-------------------------------+

我正在使用(并且必须使用)REPEATABLE READ,因此在这种情况下,T2应该(通过T1)获得新插入的行(我认为这是幻像读取的情况),但这没有发生。

关于如何最好地实现这一点的任何建议也将有所帮助。

谢谢

使用隔离级别SERIALIZABLE ,您不必担心。 不,你不必使用REPEATABLE READ 您还可以设置每个会话的隔离级别 没有其他理由不这样做。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM