REPEATABLE_READ 隔离级别 PESSIMISTIC_WRITE 锁
REPEATABLE_READ isolation level with PESSIMISTIC_WRITE lock
现在我用 PESSIMISTIC_WRITE 锁阻止来自多个实例的多个用户访问我的数据库 table 的同一行。锁定行的事务设置了默认隔离级别,即 REPEATABLE_READ.
在 table 为空的情况下,它会被新条目重新填充,这里变得很奇怪。插入是在单独的事务中运行的异步批量插入。因此,当提交此数据时,用户会读取一行以进行更新,这应该锁定该行。不知何故,这不再有效,多个用户能够从同一行中获取值。
在尝试解决这个问题时,我将隔离级别更改为 READ_COMMITED,问题不再发生。
谁能告诉我这怎么可能?我错过了什么?
为了更好的理解,这里有一些伪代码:
异步充值
Transaction
get values to insert
bulk insert
获取值
Transaction
read a row for update (Locks it)
do stuff
delete the row
为了锁定,我们使用 spring 数据中的注释:
@Lock(LockModeType.PESSIMISTIC_WRITE)
好的,答案是,aurora 2.x 的 aurora prier 使用的是 MySQL 5.6.10。 Aurora 2.x 现在正在使用 MySQL 5.7.12,问题是一个错误,现已修复。
P.S。我还在问自己为什么 aurora 使用 2 年前的 MySQL 版本,但那是另一回事了。
现在我用 PESSIMISTIC_WRITE 锁阻止来自多个实例的多个用户访问我的数据库 table 的同一行。锁定行的事务设置了默认隔离级别,即 REPEATABLE_READ.
在 table 为空的情况下,它会被新条目重新填充,这里变得很奇怪。插入是在单独的事务中运行的异步批量插入。因此,当提交此数据时,用户会读取一行以进行更新,这应该锁定该行。不知何故,这不再有效,多个用户能够从同一行中获取值。
在尝试解决这个问题时,我将隔离级别更改为 READ_COMMITED,问题不再发生。
谁能告诉我这怎么可能?我错过了什么?
为了更好的理解,这里有一些伪代码:
异步充值
Transaction
get values to insert
bulk insert
获取值
Transaction
read a row for update (Locks it)
do stuff
delete the row
为了锁定,我们使用 spring 数据中的注释:
@Lock(LockModeType.PESSIMISTIC_WRITE)
好的,答案是,aurora 2.x 的 aurora prier 使用的是 MySQL 5.6.10。 Aurora 2.x 现在正在使用 MySQL 5.7.12,问题是一个错误,现已修复。
P.S。我还在问自己为什么 aurora 使用 2 年前的 MySQL 版本,但那是另一回事了。