mysql 死鎖 知乎 事務的本質和死鎖的原理

2021-10-19 18:36:12 字數 2392 閱讀 7561

原文:

僅以mysql和spring為例,本文不介紹事務和鎖的概念。

本文使用偽**表示方法**,僅僅表達方法的意義及事務註解。

事務的形狀

在我心中,事務一直是這個樣子的

x軸是上鎖的資源,y軸是消耗的時間,

事務方塊隨著時間的流逝向下移動,

當碰觸x軸時資源加鎖,越過x軸時資源解鎖

上圖是對於方法a的事務形狀,我起名【 事務方塊】。

@transactionalfunction a()

一、多事務

當乙個方法呼叫多個被事務註解的子方法時情況是

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

function abc()this.c(){}}@transactionalfunction a()@transactionalfunction b()@transactionalfunction 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秒。

二、大事務

@transactionalfunction abc()this.b(){}this.c(){}}function a()function b()function c()

其中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

@transactionalfunction ab()this.b(){}}@transactionalfunction ba()this.a(){}}

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

當ab和ba方法同時被執行時,ab鎖定a表,ba鎖定b表,

當ab執行完a方法請求鎖定b表時,ba也執行完了b方法請求鎖定a表,

但ab沒有解開對a表的鎖定,ba也沒有解開對b表的鎖定,那麼相互等待對方解鎖,這就是死鎖。

所以減少死鎖出現的機率的辦法是減小事務方塊的大小,即減小事務方塊消耗的時間或減小事務方塊鎖定的資源【表或行】

所以行級鎖不易出現死鎖,表級鎖易出現死鎖,是因為行級鎖事務方塊小,但消耗時間不一定,還是需要參考事務消耗時間。

如果主鍵是int型別自增id,則相當於把事務可鎖定資源從乙個表分成了21億份的行,可見使用行級鎖時事務方塊明顯變小。

四、名稱來歷

事務方塊的名字來歷是因為聯想到俄羅斯方塊,俄羅斯方塊是為了給方塊找乙個位置放置,而事務方塊是為了給方塊找乙個時間間隙執行通過,兩者目的不同。

很抱歉我不會做**,請自行聯想俄羅斯方塊下落的情況。

也可以模擬成要過橋的車輛,橋寬度固定,有的車占用一車道,有的車占用兩車道,有的車占用半車道,

車的形狀多種多樣,如老式武裝三輪電單車像ab方法的小車,大客車就是一車道的長車,自行車是半車道的小車。類似的情形很多,可自行聯想。

動動手指**、在看

是對我最大的鼓勵

MySQL事物本質 事務的本質和死鎖的原理 改

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

關於資料結構本質的知乎摘抄

資料結構的本質就在於 如何將現實世界中各種各樣的資料放入到記憶體中,並且如何在記憶體中操作這些資料,如何評價這些儲存方案和操作方法。知乎原回答鏈結 對您有用的話一定要給這位答主點贊啊!資料結構難學嗎?是難學。為什麼難學?一開始上來就講空間複雜度 時間複雜度,就講抽象資料,當然難學了。1 生活 生產等...

矩陣乘法的本質(線性空間篇,知乎 馬同學)

1.線性空間 1.1概念 在一片混沌的空白空間,假裝自己不知道座標系的概念 隨便選個點作為原點,以此原點做兩個單位正交的向量,然後平面上的某個點可以這樣表示 因為是單位向量所以簡化後 整個二維平面上的點,顯然都可以通過 的方式來表示。所張成的線性空間。那麼如果 不正交,長度也不相等呢?構成的空間是什...