【发布时间】:2022-01-14 16:18:22
【问题描述】:
我正在尝试摆脱写入偏差并尝试使用可序列化的隔离级别,但我却陷入了死锁。我发现可序列化的隔离级别会因为this而导致死锁:
这个级别类似于 REPEATABLE READ,但 InnoDB 将所有普通的 SELECT 语句隐式转换为 SELECT ... LOCK IN SHARE MODE
所以,我尝试像这样使用REPEATABLE READ(没有id为“some_id”的行):
-- connection 1:
START TRANSACTION;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
select * from some_table where id="some_id" for update;
-- connection 2:
START TRANSACTION;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
select * from some_table where id="some_id" for update;
insert into some_table values("some_id");
因此,我在连接 2 中收到此消息:Lock wait timeout exceeded; try restarting transaction。
SELECT 的 FOR UPDATE 子句仅在自动提交设置为 0 或 SELECT 包含在事务中时适用。获取行上的锁,并且阻止其他事务写入行、获取锁和读取它们(除非它们的隔离级别是 READ UNCOMMITTED)。
但看起来它并没有阻止其他事务获取锁或读取行。
我做错了什么?
【问题讨论】:
标签: transactions mariadb