带有 PESSIMISTIC_WRITE 锁的 REPEATABLE_READ 隔离级别

Posted

技术标签:

【中文标题】带有 PESSIMISTIC_WRITE 锁的 REPEATABLE_READ 隔离级别【英文标题】:REPEATABLE_READ isolation level with PESSIMISTIC_WRITE lock 【发布时间】:2018-04-11 11:06:01 【问题描述】:

现在我正在阻止来自多个实例的多个用户使用 PESSIMISTIC_WRITE 锁访问我的数据库表的同一行。锁定行的事务具有默认的隔离级别设置,即 REPEATABLE_READ

在表格为空的情况下,它会被新条目重新填充,这会变得很奇怪。插入是在单独的事务中运行的异步批量插入。因此,当提交此数据时,用户会读取一行以进行更新,这应该锁定该行。不知何故,这不再起作用,并且多个用户能够从同一行获取值。

在尝试解决这个问题时,我将隔离级别更改为 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)

【问题讨论】:

【参考方案1】:

好吧,答案是,aurora 2.x 之前的 aurora 使用的是 mysql 5.6.10。 Aurora 2.x 现在使用 MySQL 5.7.12,这个问题是一个现已修复的错误。

附:我还在问自己为什么 aurora 使用 2 年前的 MySQL 版本,但那是另一回事。

【讨论】:

以上是关于带有 PESSIMISTIC_WRITE 锁的 REPEATABLE_READ 隔离级别的主要内容,如果未能解决你的问题,请参考以下文章

JPA中的PESSIMISTIC_READ和PESSIMISTIC_WRITE有什么区别?

JPA 锁定 PESSIMISTIC_WRITE 和 FEW 事务

Spring data Jpa,Mybatis,读写锁,@Lock 使用

为啥我不能将带有互斥锁的仿函数传递给线程?

Java并发 - 最好有一个带有锁的线程列表或一个带有请求列表的线程?

带有 pthread 和互斥锁的 OpenCV