事務的本質和死鎖的原理・改

一劍破萬法發表於2020-09-16

由於一些錯誤操作和被爬的原因,我重新整理了上一篇文章https://www.cnblogs.com/klarck/p/13630990.html

前言、事務方塊

在我的理解,事務是這個形狀的

x軸是可以鎖定的資源,y軸是函式執行時間,
事務隨著時間的流逝向下降落,
當恰好與x軸接觸時資源被鎖定,當恰好不再與x軸接觸時資源解除鎖定,從恰好與x軸接觸到恰好不再與x軸接觸這個時間段就是事務的執行時間。
這裡的耗時五秒是誇張的寫法,通常情況下單位是毫秒級甚至微妙級,這裡使用秒作為單位是為了凸顯現象
上圖是函式a的事務形狀,命名【 事務方塊】

 @Transactional
 public void a(){
   //對A表修改,耗時5秒
 }

一、多事務

當一個函式呼叫多個子函式且都是被事務註解的函式時情況是

上圖是對於函式abc呼叫時,a函式、b函式、c函式的事務形狀

public void abc(){
    this.a(){}
    this.b(){}
    this.c(){}
}
@Transactional
public void a(){
    //對A表修改,耗時五秒
}
@Transactional
public void b(){
    //對B表修改,耗時五秒
}
@Transactional
public void c(){
    //對C表修改,耗時五秒
}

當abc函式開始執行時,先呼叫a函式,先鎖定a表,
當a函式結束執行,a表解鎖,同時b函式開始執行,b表鎖定,
當b函式結束執行,b表解鎖,同時c函式開始執行,c表鎖定。
相當於下圖的三個事務方塊聯合且相對位置固定一起下落,總耗時十五秒

如果併發請求兩次abc函式,事務方塊如圖

首先a表被請求一鎖定五秒後解鎖,再馬上被請求二鎖定五秒,
然後b表也被請求一鎖定五秒後解鎖,再馬上被請求二鎖定五秒,
最後c表也被請求一鎖定五秒後解鎖,再馬上被請求二鎖定五秒,
而請求一在解鎖表a後緊接著又鎖定了表b五秒,同時表a再被請求二鎖定五秒
依此類推,請求二都在請求一解鎖對應的表後鎖定該表,
那麼總執行時間二十秒

二、大事務

@Transactional
function abc(){
     this.a(){}
     this.b(){}
     this.c(){}
}
public void a(){
	//對A表修改,耗時五秒
}
public void b(){
	//對B表修改,耗時五秒
}
public void c(){
	//對C表修改,耗時五秒
}

其中abc函式有註解,而子函式a、b、c沒有註解,事務形狀如圖

a、b、c三個顏色的方塊是結合在一起的,必須一起執行,實際上就是事務原子性的表象,那麼a表被鎖定十五秒,b表被鎖定十秒,c表被鎖定五秒
若也同時併發兩次abc函式則總耗時三十秒,容易發現事務越大,耗時越長;本來在多事務時被鎖定五秒的a表,被鎖定了十五秒。
在這個abc函式中,事務對錶的鎖定是懶鎖定的情況,
就是說,當abc函式中
a函式開始執行時,只鎖定了a表,當a函式執行完成,
b函式開始執行鎖定b表,此時不解鎖a表,當b函式執行完成,
c函式開始執行鎖定c表,此時不解鎖a、b兩個表,當c函式執行完成,同時解鎖a、b、c三個表。
這就導致了死鎖的出現

三、死鎖

有如下兩個函式ab和ba

 @Transactional
 public void ab(){
   this.a(){}
   this.b(){}
 }
 @Transactional
  public void ba(){
   this.b(){}
   this.a(){}
 }

當ab和ba函式同時被執行時,事務方塊類似下圖,但不完全

當ab和ba函式同時被執行時,ab鎖定a表,ba鎖定b表,
當ab執行完a函式請求鎖定b表時,同事ba也執行完了b函式請求鎖定a表,
但ab沒有解開對a表的鎖定,ba也沒有解開對b表的鎖定,那麼相互等待對方解鎖,出現死迴圈,這就是死鎖。
所以減少死鎖出現的機率的辦法是減小事務方塊的大小,即減小事務方塊消耗的時間或減小事務方塊鎖定的資源【表或行】
所以行級鎖不易出現死鎖,表級鎖易出現死鎖,是因為行級鎖資源佔用小,當時間相同時,行級鎖的事務方塊小。
當表的主鍵是整型的自增ID時,則相當於把事務可鎖定資源從一個資源【表】分割成了2147483647份的資源【行】,可見使用行級鎖時事務方塊明顯變小。

四、名稱來歷

事務方塊的名字來歷是一次研究死鎖時聯想到俄羅斯方塊的情形與事務的情形類似,俄羅斯方塊是為了找一個位置放置方塊,而事務方塊是為了找一個時空縫隙讓方塊執行通過,目的不同。

【網路圖片侵刪】

相關文章