數據庫事務
結合基本例子(銀行轉賬)來分析:
AB賬戶都有500元存款,A賬戶向B賬戶轉賬100元錢 ,操作分為6步
- 取出A賬戶余額為500元
- 把500元轉出100,還剩400元
- 將400元存入A的賬戶中
- 取出B的余額為500元
- 將B的500元加上100元,總共600元
- 將600元存入B的賬戶中
事務有四大特性(ACID):
- 原子性(Atomicity):所有的操作要么都成功,要么都失敗回滾,恢復之前狀態。如上6步操作,任何一步操作失敗,AB賬戶不受任何影響。
- 一致性(Consistency): 事務必須使數據庫從一個狀態整體變到另一個狀態,就是執行前后,必須保持狀態一致。相當于轉賬前AB加起來一共1000元,不管中間進行幾次轉賬,最終兩人加起來還得是1000元。
- 隔離性(Isolation):多事務并發執行,相互之間不存在影響。事務沒有提交之前,其他事務讀取的數據還是修改之前的數值。相當于AC都向B轉賬,A和C向B轉賬的過程中,其他事務讀取B的余額還是500元,直到AC兩個事務提交成功,B的賬戶應該就是700元。
- 持久性(Druability):一旦事務被提交,對數據庫的改變就是永久的。一旦轉賬事務提交成功,數據庫數據將永久被改變。
數據庫隔離級別
-
未提交讀:
事務進行的修改,即使沒有提交,對于其他事務也是可見的 -
提交讀:
大部分數據庫用這個(mysql不是),事務在開始到提交前,進行的修改對其他事務都是不可見的,因為會出現不可重復讀,兩次讀到的數據不一致 -
可重復讀:
mysql數據庫默認使用的這種,保證了一個事務中多次讀取同樣的數據保持結果一致。但是不能避免幻讀現象(事務讀取某范圍內記錄,另外事務插入一行,再次讀取,就會產生幻行) -
可串行化:
最高的隔離級別,強制事務串行執行,避免幻讀問題,會在讀取的每一行數據上加鎖,可能會導致大量超時和鎖爭用。
InnoDB存儲引擎
InnoDB的MVCC(多版本并發控制),通過在每行記錄后面增加兩個隱藏列,保存行創建時系統版本號和刪除時的版本號。
優點:大部分讀操作不用加鎖,保證只能讀到符合標準的行
缺點:每行記錄需要增加額外的存儲空間
默認使用的隔離級別是REPEATABLE READ(可重復讀),并且采用間隙鎖策略防止幻讀。(刪除一個不存在的記錄,就會掃描索引,找到第一個比給定參數小的值,找到第一個比給定參數大的值,這樣形成一個區間,鎖住這個區間,就是間隙鎖,這樣容易出現死鎖)
MyISAM存儲引擎
對整張表加鎖,讀數據時加共享鎖,寫數據時加排他鎖,但是在表有讀取數據的查詢時,還是可以往表中插入數據(并發插入)