首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

关于mysql的事务,这些你都了解了么?

这篇博文源于公司一个批处理的项目异常而起的。先简单描述下发生背景。一个基于spring batch开发的批处理应用,线上运行了9个多月后,某一天突然跑批任务失败了,检查日志得知,是因为一个mysql异常导致的:Lock wait timeout exceeded。msyql事务锁等待超时这个异常虽然不常见,但随便一搜就会看到大量的相关的信息。导致这个异常的原因就是mysql数据库事务锁等待超时,默认超时时间是50S。但我们的批处理业务从逻辑上讲不会出现这种事务排他锁等待的情况,不得其解。故通过以下这些实例来捋一捋mysql事务内隔离级别和锁等知识点,看看是否如我们了解的这样,同时加深下印象。

02

Mysql锁共享锁排它锁 (1)—mysql进阶(六十八)

前面说了为了解决脏读,幻读,不可重复读,mysql设置了四种隔离级别,read committed和read uncommitted会发生幻读和不可重复读,repeatable read会发生不可重复读,seriliztable,mysql默认是repeatable read,用mvcc解决不可重复读。设置隔离级别set global|session transaction isolation level …。当global时候,代表执行完之后其他所有session都可以使用当前设置的事务,如果是session则代表之后当前session才可以执行当前设置的事务,如果什么都没加,则是默认下一条事务提交完毕,就恢复之前的事务。Mvcc用他的readView链表控制解决这不可重复读,每次执行修改,都会吧修改的数据放入readView链表,链表有一个参数是trx_id,链表的头部第一条数据显示的是页面数据,后面的都是undo数据。里面有m_ids,min_trx_id,max_trx_id,creator_trx_id,主要在里面遍历,判断是否满足数据在当前事务可见性,比如creator_trx_id等于当前事务id,意味着该版本可以在当前事务查看,如果当前事务id大于mix_trx_id,表明该版本链在事务后才生成,则不可见,如果当前事务id小于min_trx_id,则表示该版链已提交,可以见。如果在这两个之间,则看是否事务id在m_ids里面,是就代表是活跃事务,不可见。这就保证了事务的可重复读。

01
领券