mysql事务与锁研究

本文探讨了MySQL在同一会话中事务的超时和重新开启事务的行为。在RR隔离级别下,即使事务超时,再次begin不会提交之前事务的数据,而是开启新事务。这可能导致库存锁定问题,建议检查代码中事务的处理方式。分析涉及trx_id、trx_mysql_thread_id和next-key locks等概念。
摘要由CSDN通过智能技术生成

MySql 已知条件

1、 同一个连接会话 trx_mysql_thread_id 不会变,不同事务 trx_id 不一样

2、 可重复读 通过 next-key locks 锁定

模拟场景

1 begin 开启事务后,如果没有立刻去读取A数据,
2 开启事务更新A数据并提交,1 事务这个时候去读取 A数据 将会读到 2 事务更新后的 A数据

同一会话事务超时后重新开启事务分析

跑波次运行时,如果库存被锁住,事务超时后不做回滚, 后开始调用 函数rollback 里面也会有开启事务,但是事务提交后没生效

分析

navicat模拟场景

MySql 版本 v5.6 事务隔离级别:RR
代码中事务隔离级别为RC,但实验后发现跟隔离级别无关

session 1session 2
开启事务开启事务
SELECT * from location_inventory where id = 272566 FOR UPDATE无操作
无操作update location_inventory set onHandQty =1100 where id = 272566
thId:275128,trxId:402631076thId:275633,trxId:402631085
无操作超时50s
无操作开启事务
thId:275128,trxId:402631076INFORMATION_SCHEMA.INNODB_TRX无法查到事务
无操作update location_inventory set onHandQty =1100 where id = 272566
thId:275128,trxId:402631076thId:275633,trxId:402631961

从表格中可以看到begin开启事务后,再次begin会关闭上次事务,那这里就有一个疑问begin后再begin那之间修改后的数据有提交吗?

答案是可以提交更新的,begin也将触发提交事件同时开启一个新的事务。但如果上一个事务超时,这个时候再 begin 事务只是关闭而不会更新数据

从以上分析可以看出来,波次运行的问题应该是代码层面的问题,需要分析下代码中是如何开启事务。

参考:

http://blog.sae.sina.com.cn/archives/2127

https://www.cnblogs.com/wade-luffy/p/9689975.html#_label2

https://zh.wikipedia.org/wiki/%E5%A4%9A%E7%89%88%E6%9C%AC%E5%B9%B6%E5%8F%91%E6%8E%A7%E5%88%B6

http://hedengcheng.com/?p=771#_Toc374698308

如何阅读死锁日志:

https://juejin.im/post/5d483e66518825052734b15a

https://blog.csdn.net/dhfzhishi/article/details/81272360

https://www.aneasystone.com/archives/2018/04/solving-dead-locks-four.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值