当前位置: 首页 > 知识库问答 >
问题:

隔离级别为serializable的事务中出现死锁

李开宇
2023-03-14

我试图理解锁定如何与隔离级别一起工作。我已经回答了这个问题,但无法理解给定打击的流

在这里,我在不同的终端中启动两个事务,并在其中读取同一行。当我尝试更新它们时,两个终端都在等待更新。除此之外,没有其他查询正在运行

这是我做的一系列步骤

conn1: START TRANSACTION;
conn1: SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
conn2: START TRANSACTION;
conn2: SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
conn1: SELECT * from users WHERE id = 1;
conn2: SELECT * from users WHERE id = 1;
conn1: UPDATE users set name = 'name' WHERE id = 1; waiting...
conn2: UPDATE users set name = 'name' WHERE id = 1; waiting...

这是我的第一个问题
这里我想了解为什么两个连接都在等待,以及它们是否是谁拥有更新行的锁?

如果我将上述步骤更改为

conn1: START TRANSACTION;
conn1: SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
conn2: START TRANSACTION;
conn2: SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
conn1: UPDATE users set name = 'name' WHERE id = 1;
conn2: SELECT * from users WHERE id = 1; waiting...
conn1: commit
conn2: updated results

在这种情况下,不同的是我可以看到conn1有锁,在它提交或回滚更改之前,所有其他请求都将等待,如果conn1提交,则会得到更新的结果

这是我的第二个问题,如果
我想锁定一行并且如果锁定,我希望其他连接等待(甚至读取)直到此锁定释放(提交或回滚)或我应该用于更新子句,这是正确的方法

数据库 - Mysql 5.7

共有1个答案

程卓君
2023-03-14

正如mysql文档中关于可序列化隔离级别的内容所说:

此级别类似于REPEATABLE READ,但InnoDB隐式地将所有纯SELECT语句转换为SELECT…LOCK IN SHARE MODE

自动提交条款在这里不适用,因为您显式启动事务。

这意味着在第一个场景中,两个事务都在同一条记录上获得一个共享锁。然后,第一个事务(T1)试图执行更新,这需要一个排他锁。这是不可能的,因为T2持有共享锁。然后,T2尝试更新,但由于T1持有共享锁而无法完成。

是否使用原子更新或select…for update语句来锁定记录取决于您需要应用的应用程序逻辑。如果需要获取记录的数据并在更新记录之前对这些数据进行一些复杂的计算,请使用select…for update方法。否则,进行原子更新。

 类似资料:
  • 问题内容: 也许有人可以帮助我解决Spring(3.1)/ Postgresql(8.4.11)中的事务性问题 我的交易服务如下: Spring配置Webapp包含: 让我们说一个请求“ x”和一个请求“ y”同时执行并到达注释“比较”(方法insertObject)。然后,允许他们两个都插入一个新对象,并提交他们的事务。 为什么我没有RollbackException?据我所知,这就是可序列化等

  • 本文向大家介绍事务的隔离级别有哪些?相关面试题,主要包含被问及事务的隔离级别有哪些?时的应答技巧和注意事项,需要的朋友参考一下 SQL 标准定义了四个隔离级别: READ-UNCOMMITTED(读取未提交): 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。 READ-COMMITTED(读取已提交): 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重

  • 我有一个对具有 SQL API 的 Cosmos 容器的长期运行查询,该查询需要 10 分钟以上才能完成。有没有办法将数据库的隔离级别设置为“可重复读取”或“可序列化”,以避免幻像读取,如这里所定义的那样? 我知道我们可以为 Cosmos DB 设置一致性级别,但它仅适用于地质副本之间的读/写一致性,而不适用于事务隔离。

  • 本文向大家介绍MySQL的默认事务隔离级别是?相关面试题,主要包含被问及MySQL的默认事务隔离级别是?时的应答技巧和注意事项,需要的朋友参考一下 读未提交(RU): 一个事务还没提交时, 它做的变更就能被别的事务看到. 读提交(RC): 一个事务提交之后, 它做的变更才会被其他事务看到. 可重复读(RR): 一个事务执行过程中看到的数据, 总是跟这个事务在启动时看到的数据是一致的. 当然在可重复

  • 我将spring应用程序连接到smartbaer servicev,在那里创建了虚拟数据源(Postgres)。 驱动程序类: 连接字符串(本地servicev虚拟服务器url): 应用程序.属性:- spring.datasource.driver-class-name=com.smartbear.servicev.jdbc.driver.jdbcvirtdriver spring.dataso

  • 本文向大家介绍MySQL四种事务隔离级别详解,包括了MySQL四种事务隔离级别详解的使用技巧和注意事项,需要的朋友参考一下 本文实验的测试环境:Windows 10+cmd+MySQL5.6.36+InnoDB 一、事务的基本要素(ACID)   1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所