MYSQL 插入意向锁死锁.docx
《MYSQL 插入意向锁死锁.docx》由会员分享,可在线阅读,更多相关《MYSQL 插入意向锁死锁.docx(5页珍藏版)》请在第一文库网上搜索。
1、插入意向锁死锁本章介绍种比较不常见的死锁现象,和我们通常理解的死锁发生过程不太样,能使读者对死锁现象有新的理解。问题现象死锁这种情况大家肯定都遇到过,第34章和第35章也介绍了两个死锁案例,本章的案例是客户在生产系统中遇到一个死锁现象,通常死锁发生的情况如图36-1所示。但是不能理解在这种情况下为何会发生死锁。图36-1 (图片来自网络)当两个事务都试图获取另一个事务已经拥有的锁时,就会发生死锁。事务 1 (Transaction 1)在记录A (Record A)上获得锁,事务2 (Transaction 2)在记录B (Record B)上获得锁。随后每个事务都尝试获取另一个事务持有的锁将
2、触发死锁。但在这个案例中死锁的产生和上述所讲的情况有些不一样,我们来模拟一下。(1)环境信息 事务隔离级别:RR MySQL版本:8.0.13(2)复现情况表结构及数据如下:mysql CREATE TABLE t (a INT UNSIGNED NOT NULL PRIMARY KEY, b INT);mysql INSERT INTO t VALUES(10,0),(20,0);操作步骤如表36-1所示。表36Sessicm 1Session 2BEGIN;UPDATE t SET b=l WHERE a=20;执行成功BEGIN;SELECT* FROM t LOCK IN SHARE
3、MODE;发生阻塞INSERT INTO t VALUES(lLl);/H 刻Session 2报山死锁惜展SELECT * FROM t LOCK IN SHARE MODE;ERROR 1213 (4()001): Deadlock found when trying to getlock; try restarting transaction在Session 1中执行了UPDATE语句,随后在Session 2中执行了一个全表查询并且带上IN SHARE MODE添加了共享锁,接下来在Session 1中再次执行了INSERT语句,同时Session 2直接报出死锁事务被回滚了。问题分析
4、针对上述情况,令人疑惑的地方有如下几点: 两个事务之间是如何加锁的? 为何产生了死锁? 发生死锁后为什么是Session 2中的事务被回滚了?之前我们分析死锁问题都是通过查看死锁日志来进行的,这次我们使用MySQL 8.0中的performance.dataocks表,通过分析每一条语句执行后的加锁情况来分析这个死锁问题。两个事务之间是如何加锁的?当Session 1执行完UPDATE语句后,加锁情况如图36-2所示。| CWGXNC.IOCK.XO 1 ENGIME.TRANSACTXON.XO | THAO.XO | OB3CCT.SCHCRA | 0e3CT.NAM | XHDCX.MA
5、MC | LOCK.TYPt | LOCX.RODt110CK.STATUS | LOCK.DATA | 3ie33:MU|31G33 |S | dhy| t| NULL| TABLE| IX1GftANIEO| NULL| 3im:5$:4:3|31033 |56 | | XM.H0T.3 1GRANTtO1 ”112ai4797S9MMe8:lin12ai4797SM54e812 1|t1NULL1TA&LE1 IS1GRAMTED| KULL112ai47975MS498 :55:4:21“79759254081d”1t1PRXMAirr1WCOttO1 SIGRANTtO1112tl4
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MYSQL 插入意向锁死锁 插入 意向 死锁