当前位置:网站首页>事务的本质和死锁的原理

事务的本质和死锁的原理

2020-11-06 21:35:11 程序猿欧文

仅以MySQL和spring为例,,本文不介绍事务和锁的概念。
本文使用伪代码表示方法代码,仅仅表达方法的意义及事务注解
〇、事务的形状
在我心中,事务一直是这个样子的

x轴是上锁的资源,y轴是消耗的时间,
事务方块随着时间的流逝向下移动,
当碰触x轴时加锁,越过x轴时解锁
上图是对于方法a的事务形状,我起名【 事务方块】,很抱歉我不会做动图,本文以动图来表达最佳。

@Transactional
function a(){
    对A表修改,耗时五秒
}
一、多事务
当一个方法调用多个被事务注解的子方法时情况是

上图是对于方法abc调用时,a方法、b方法、c方法的事务形状
function abc(){
    this.a(){}
    this.c(){}
}
@Transactional
function a(){
    对A表修改,耗时五秒
}
@Transactional
function b(){
    对B表修改,耗时五秒
}
@Transactional
function c(){
    对C表修改,耗时五秒
}
其中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秒
二、大事务
@Transactional
function abc(){
    this.a(){}
    this.b(){}
    this.c(){}
}

funct.........

版权声明
本文为[程序猿欧文]所创,转载请带上原文链接,感谢
https://my.oschina.net/mikeowen/blog/4553869