今天咱們說說事務,相信大家都知道事務的 ACID (Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔離性、持久性)。 原子性:表示一個事務不可在分割,而且事務中的操作要麼一起成功,要麼一起失敗; 一致性:表示事務前後數據的完整性必須保持一致; ...
今天咱們說說事務,相信大家都知道事務的 ACID (Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔離性、持久性)。
原子性:表示一個事務不可在分割,而且事務中的操作要麼一起成功,要麼一起失敗;
一致性:表示事務前後數據的完整性必須保持一致;
持久性:表示事務一旦進行提交,那麼數據的就改便會永久保存,即使資料庫出現宕機也不會任何影響。
前面三個很好理解,那咱們再說說事務的隔離性,事務的隔離就是表示事務與事務之間不會相互干擾。但是多事務的情況下,還是很容易出現臟讀、不可重覆讀以及幻讀的問題。我們簡單的解釋一下這幾個詞,
臟讀:當資料庫中一個事務A正在修改一個數據但是還未提交或者回滾,另一個事務B 來讀取了修改後的內容並且使用了,之後事務A提交了,此時就引起了臟讀。
此情況僅會發生在: 讀未提交的的隔離級別.
不可重覆讀:在一個事務A中多次操作數據,在事務操作過程中(未最終提交),事務B也才做了處理,並且該值發生了改變,這時候就會導致A在事務操作的時候,發現數據與第一次不一樣了。 就是不可重覆讀。
此情況僅會發生在:讀未提交、讀提交的隔離級別.
幻讀:一個事務按相同的查詢條件重新讀取以前檢索過的數據,卻發現其他事務插入了滿足其查詢條件的新數據,這種現象就稱為幻讀。幻讀是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數據進行了修改,比如這種修改涉及到表中的“全部數據行”。同時,第二個事務也修改這個表中的數據,這種修改是向表中插入“一行新數據”。那麼,以後就會發生操作第一個事務的用戶發現表中還存在沒有修改的數據行,就好象發生了幻覺一樣.一般解決幻讀的方法是增加範圍鎖RangeS,鎖定檢索範圍為只讀,這樣就避免了幻讀。
此情況會回發生在:讀未提交、讀提交、可重覆讀的隔離級別。
說完上面的問題,咱們再說說事務具體的隔離級別,事務隔離級別越高效率就越低。事務隔離的級別大致分為以下幾種,
讀未提交(read uncommited)、讀提交((read commited)、可重覆讀(repeatable read)以及串列化(serializable)。那麼我來解釋一下這幾種隔離級別,
讀未提交:表示一個事務沒有提交,其他事務便能讀取到它所修改的內容;
讀提交:表示一個事務必須提交了,其他事務才能讀取到它所修改的內容;
可重覆讀:表示一個事務從開始到執行結束看到的數據與此事務開啟時看到的數據是一致的;
串列化:表示一個事務中不管是讀寫操作都會加鎖,讀會加讀鎖,寫會加寫鎖,如果多個事務出現讀寫衝突的時候,那麼必須等前一個事務執行完成,才能執行下一個事務。
可以下麵代碼查詢你當前資料庫的事務隔離級別
mysql> show variables like 'transaction_isolation';
Empty set, 1 warning (0.13 sec)
mysql 預設是為空的。你可以將啟動參數 transaction-isolation 的值設置成 READ-COMMITTED ,這裡我也建議大家把事務隔離設置成 “讀提交”。當然具體設置成什麼級別還得根據業務來。
事務隔離性的實現原理
在資料庫中會創建一個視圖,訪問的時候以試圖的邏輯結果為準。
在 “可重覆讀” 隔離級別下,這個視圖是在這個事務啟動時創建的,並且從始至終都是在用這個視圖,原因就是 “事務從開始到執行結束看到的數據與此事務開啟時看到的數據是一致的 ”;
在 “讀提交” 隔離級別下,這個視圖是在每個sql語句開始執行的時候創建的;
這裡需要註意的是 在“讀未提交” 隔離級別下,是沒有視圖概念的,因它直接取得就是最新得值;
“串列化” 隔離級別更沒有視圖得概念了,因為它直接加鎖了,這樣避免其他事務得並行訪問。
事務隔啟動方式
Mysql的事務啟動方式有以下幾種,
1、顯式的啟動事務,使用 begin 或者 start transation ,然後還有 begin 或者 start commit 事務提交,begin 或者 start rollback 事務回滾;
2、也可以設置自動提交,set autocommit=0表示設置為事務關閉自動提交,如果為 1 則表示啟動自動提交,當然自動提交事務的前提必須是要開啟事務,所以這裡就多了一步操作,使用 begin 開啟事務。如果你認為這樣很麻煩的話,你也可以執行 commit work and chain ,表示自動提交,並自動啟動下一個事務。
好啦,今天就說到這裡,如果有什麼問題,歡迎大家一起研究討論。