事務
什么是事務
一個事務由作為一個單獨單元的一個或者多個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:嘗試把大的事務分成小的事務然后分別執行。
選擇合適的隔離級,隔離級越高,性能越低,所以選擇合適的孤立級,有助于性能優化
避免死鎖,在一個事務環境中,當兩個或者多個處于不同序列的客戶同時想要更新相同的數據時,就會發生死鎖,我們應該 避免發生死鎖。