mysql - 当另一个事务拥有排他锁时,MySQL 如何允许获取共享锁?

标签 mysql concurrency transactions rdbms

我试图了解交易是如何工作的,但我遇到了一个对我来说没有多大意义的场景。我希望有人能帮助我理解它。

我有两笔交易

交易1

 BEGIN; update data set val = val + 1 where id = 1

交易2

BEGIN; select * from data

我打开了两个终端,我开始第一个事务并运行更新查询。据推测,这为 ID 为 1 的元组上的事务 1 提供了独占锁。

接下来,我在提交第一个事务之前在另一个终端中运行第二个查询。我预计它会停止,因为第一个事务具有排他锁,这将阻止该事务获取 id 1 的元组上的读锁。

但是,mysql 运行选择查询并返回“非脏”数据。

有人能给我解释一下 mysql 的这种行为吗?

最佳答案

默认情况下,SELECT 不需要共享行锁。它可以通过使用 multi-version concurrency control (MVCC) architecture 读取该行的最新提交版本而无需锁定。 .

你可以写一个SELECT query that explicitly requests a lock ,但如果没有这些锁定子句,SELECT 就不需要行锁。

关于mysql - 当另一个事务拥有排他锁时,MySQL 如何允许获取共享锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63363191/

相关文章:

django - 事务管理的 block 以挂起的 COMMIT/ROLLBACK 结束

database - Cloud Firestore 文档锁定

mysql - CentOS:MySQL ERRNO 28

c++ - 多线程没有提高递归C++程序的性能

java - ConcurrentHashMap 中的 Dose Segment 存在虚假共享问题?

php - 查找交易文件中100笔交易中连续出现5个以上序号的事件

php - 从 mysql 字段获取总计

mysql - 授予 ROOT 访问权限

php - 我想根据连接的列对数据进行排序

java - Jprogress Bar和并发