一,事務的四個特性:
底層原理:實現原子性的關鍵,是當事務回滾時能夠撤銷所有已經成功執行的sql語句。innodb實現回滾,靠的是undo log:當事務對資料庫進行修改時,innodb會生成對應的undo log;如果事務執行失敗或呼叫了rollback,導致事務需要回滾,便可以利用undo log中的資訊將資料回滾到修改之前的樣子。
undo log屬於邏輯日誌,它記錄的是sql執行相關的資訊。當發生回滾時,innodb會根據undo log的內容做與之前相反的工作:對於每個insert,回滾時會執行delete;對於每個delete,回滾時會執行insert;對於每個update,回滾時會執行乙個相反的update,把資料改回去。
二,事務的隔離級別:
隔離級別越高,效能越低。
不可重複讀&幻讀區別:
如果使用鎖機制來實現這兩種隔離級別,在可重複讀中,該sql第一次讀取到資料後,就將這些資料加鎖,其它事務無法修改這些資料,就可以實現可重複讀了。但這種方法卻無法鎖住insert的資料,所以當事務a先前讀取了資料,或者修改了全部資料,事務b還是可以insert資料提交,這時事務a就會發現莫名其妙多了一條之前沒有的資料,這就是幻讀,不能通過行鎖來避免。需要serializable隔離級別 ,讀用讀鎖,寫用寫鎖,讀鎖和寫鎖互斥,這麼做可以有效的避免幻讀、不可重複讀、髒讀等問題,但會極大的降低資料庫的併發能力。
不可重複讀重點在於update和delete,而幻讀的重點在於insert。
public
enum isolation
檢視全域性事務隔離級別:select @@global.tx_isolation
設定全域性事務隔離級別:set global transaction isolation level read committed;
檢視當前會話事務隔離級別:select @@tx_isolation
設定當前會話事務隔離級別:set session transaction isolation level read committed;
三,事務的7種傳播行為
注意:事務的傳播行為不是jdbc規範中的定義。傳播行為主要針對實際開發中的問題
required 支援當前事務,如果不存在,就新建乙個
supports 支援當前事務,如果不存在,就不使用事務
mandatory 支援當前事務,如果不存在,丟擲異常
requires_new 如果有事務存在,掛起當前事務,建立乙個新的事務
not_supported 以非事務方式執行,如果有事務存在,掛起當前事務
never 以非事務方式執行,如果有事務存在,丟擲異常
nested 如果當前事務存在,則巢狀事務執行(巢狀式事務)
這七種事務傳播機制最常用的就兩種:
required:乙個事務,要麼成功,要麼失敗
requires_new:兩個不同事務,彼此之間沒有關係。乙個事務失敗了不影響另乙個事務。
public
enum propagation
mysql事務隔離級別及傳播機制
transaction 事務隔離級別 在說明事務隔離級別之前先說一下髒讀 不可重複讀 幻讀這三個概念。髒讀 乙個事務讀取到另一事務未提交的更新新據。當乙個事務正在訪問資料,並且對資料進行了修改,而這種修改還沒有 提交到資料庫中,這時,另外乙個事務也訪問這個資料,然後使用了這個資料。因為這個資料是還沒...
事務的隔離級別舉例 事務,事務隔離級別,傳播行為
什麼是事務 事務是訪問資料庫的乙個操作序列,資料庫應用系統通過事務集來完成對資料庫的訪問。事務的正確執行使得資料庫從一種狀態轉換為另一種狀態,事務須服從acid原則 原子性 事務要麼全部被執行,要麼全部不執行。成功則資料庫狀態發生變化,失敗則不會發生狀態轉換 一致性 使資料庫從一種正確狀態轉換成另外...
Spring 事務隔離級別與傳播特性
1.原理 a.spring事務的本質就是資料庫對事務的支援,沒有資料庫事務的支援,spring是無法提供事務功能的 b.純jdbc操作步驟 獲取連線 connection conn drivermanager.getconnection 開啟事務 conn.setautocommit true fa...