首頁 >資料庫 >mysql教程 >深入理解MySQL進階漂流記(五)

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

黄舟
黄舟原創
2017-03-08 13:56:571499瀏覽

交易

什麼是交易

一個交易由作為一個單獨單元的一個或多個sql語句組成。這個單元中的每個sql語句是互相依賴的, 而且單元作為一個整體是不可分割的。如果單元中的一個語句無法成功完成,整個單元都會回滾,所有影響到的資料將會回到 事務開始之前的狀態。因而,只有事務中的所有語句都被成功的執行才能說這個事務被成功執行。

事務的四個特性:

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

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

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

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

生命週期

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

一旦sql語句被執行,就可使用commit指令來把整個交易保存在磁碟上,或是使用rollback指令來撤銷所有的變更。 如果事務包括事務表和非事務表的變化,非事務表的事務處理部分是不能使用rollback指令撤銷的。在這種情況下, MySQL將會回傳一個錯誤,通知出現一個不完全撤銷。
commit指令標記了事務區塊的結束。

控制事務行為

MySQL提供了兩個變數來控制事務行為:autocommit變數和transaction isolation level變數。
自動提交,預設情況下,MySQL的sql查詢一旦執行,就會自動向資料庫提交結果。這種預設的行為可以透過特定的 autocommit變數來進行修改。設定set autocommit=0,隨後表格的更新將不會被儲存,直到明確發出commit指令。

交易隔離級,MySQL預設為repeatable read隔離級,可以使用set來修改。

交易和效能

因為支援交易的資料庫在保持不同使用者彼此隔離方面要比非交易資料庫難,所以自然的反應了系統的效能。
我們需要做一些事情來保證事務不會為系統添加不適當的負擔。

使用小事務,兩個普遍的策略:
1:保證所有要求的使用者輸入在發出start transaction指令之前都是可行的
2:試著把大的事務分成小的事務然後分別執行。

選擇合適的隔離級,隔離級越高,性能越低,所以選擇合適的孤立級,有助於性能優化

避免死鎖,在一個事務環境中,當兩個或多個處於不同序列的客戶同時想要更新相同的資料時,就會發生死鎖,我們應該避免發生死鎖。


以上是深入理解MySQL進階漂流記(五)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn