新闻资讯
事务的本质和死锁的原理
仅以MySQL和Spring为例,本文不介绍事务和锁的概念。
本文使用伪代码表示方法代码,仅仅表达方法的意义及事务注解。
事务的形状
在我心中,事务一直是这个样子的
x轴是上锁的资源,y轴是消耗的时间,
事务方块随着时间的流逝向下移动,
当碰触x轴时资源加锁,越过x轴时资源解锁
上图是对于方法a的事务形状,我起名【 事务方块】。
@Transactionalfunction a(){ 对A表修改,耗时五秒}
一、多事务
当一个方法调用多个被事务注解的子方法时情况是
其中abc方法开始执行时,执行到a方法,锁定a表,当a方法结束b方法开始时,a表解锁,b表锁定,当b方法结束c方法开始时,b表解锁c表锁定。
相当于下图的三个事务方块联合且相对位置锁定一起下落,总运行时间15秒
如果并发请求两次abc方法则事务方块如下图
其中a表会先被请求1锁定5秒后解锁,再被请求2锁定5秒,
其中b表也会先被请求1锁定5秒后解锁,再被请求2锁定5秒,
其中c表也会先被请求1锁定5秒后解锁,再被请求2锁定5秒,
而请求1在解锁表a后紧接着又锁定了表b五秒,同时表a再被请求2锁定5秒
依次类推,请求2都在请求1解锁对应的表之后,锁定该表,
那么总运行时间20秒。
二、大事务
其中abc方法上有事务注解,而子方法a、b、c上没有事务注解,事务方块形状如下图
a、b、c三个颜色的方块是结合在一起的只能一起执行,那么a表被锁定15秒,b表被锁定10秒,c表被锁定5秒
如果也并发请求两次abc方法则总耗时30秒,显而易见事务方块越大,耗时越长。
在这个abc方法中,事务锁定表是懒锁定的方式,就是说
当abc中a方法开始执行时,只锁定了a表,执行完a方法后,
开始执行b方法锁定b表,此时a表不解锁,当b方法执行完后,
开始执行c方法锁定c表,此时a、b两个表都不解锁,当c方法执行完后,a、b、c三个表一起解锁。
这就造成了以下情况。
三、死锁
有如下两个方法ab和ba
当ab和ba方法同时被执行时,事务方块类似下图,但不完全
本内容属于网络转载,文中涉及图片等内容如有侵权,请联系编辑删除
回复列表