深入理解MySQL進階漂流記(五)

事務

什么是事務

一個事務由作為一個單獨單元的一個或者多個sql語句組成。這個單元中的每個sql語句是互相依賴的, 而且單元作為一個整體是不可分割的。如果單元中的一個語句不能成功完成,整個單元都會回滾,所有影響到的數(shù)據(jù)將返回到 事務開始之前的狀態(tài)。因而,只有事務中的所有語句都被成功的執(zhí)行才能說這個事務被成功執(zhí)行。

事務的四個特性:

原子性(Atomicity),每個事務都必須被認為是一個不可分割的單元。

一致性(Consistency),不管事務是完全成功還是中途失敗,當事務使系統(tǒng)處于一致的狀態(tài)時存在一致性。

隔離性(Isolation),每個事務在它自己的空間發(fā)生,和其他發(fā)生在系統(tǒng)中的事務隔離,而且事務的結(jié)果只有在它完全被執(zhí)行時才能看到。

持久性(Durability),即使系統(tǒng)崩潰,一個提交的事務扔在堅持。

生命周期

為了初始化一個事務,并告訴MySQL所有隨后的sql語句需要被認為是一個單元,MySQL提供了start transaction命令來標記 一個事務的開始。也可以使用begin或者begin work命令來初始化一個事務。通常情況下,start transction命令后跟隨的 是組成事務的sql語句。

一旦sql語句被執(zhí)行,就可使用commit命令來把整個事務保存在磁盤上,或者使用rollback命令來撤銷所有的變化。 如果事務包括事務表和非事務表的變化,非事務表的事務處理部分是不能使用rollback命令撤銷的。在這種情況下, MySQL將會返回一個錯誤,通知出現(xiàn)一個不完全撤銷。
commit命令標記了事務塊的結(jié)束。

控制事務行為

MySQL提供了兩個變量來控制事務行為:autocommit變量和transaction isolation level變量。
自動提交,默認情況下,MySQL的sql查詢一旦被執(zhí)行,就會自動向數(shù)據(jù)庫提交結(jié)果。這種默認的行為可以通過特定的 autocommit變量來進行修改。設置set autocommit=0,隨后表的更新將不會被保存,直到明確發(fā)出一個commit命令。

事務隔離級,MySQL默認為repeatable read隔離級,可以使用set來修改。

事務和性能

因為支持事務的數(shù)據(jù)庫在保持不同用戶彼此隔離方面要比非事務數(shù)據(jù)庫難,所以自然的反應了系統(tǒng)的性能。
我們需要做一些事情來保證事務不會向系統(tǒng)添加不適當?shù)呢摀?/p>

使用小事務,兩個普遍的策略:
1:保證所有要求的用戶輸入在發(fā)出start transaction命令之前都是可行的
2:嘗試把大的事務分成小的事務然后分別執(zhí)行。

選擇合適的隔離級,隔離級越高,性能越低,所以選擇合適的孤立級,有助于性能優(yōu)化

避免死鎖,在一個事務環(huán)境中,當兩個或者多個處于不同序列的客戶同時想要更新相同的數(shù)據(jù)時,就會發(fā)生死鎖,我們應該 避免發(fā)生死鎖。

? 版權聲明
THE END
喜歡就支持一下吧
點贊14 分享