我试图了解交易是如何工作的,但我遇到了一个对我来说没有多大意义的场景。我希望有人能帮助我理解它。
我有两笔交易
交易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/