工作很多年了,整理下自己的知識體系。
spring為了方便事務管理,提供了註解與xml配置事務的形式。
業務中事務使用時注意點:
1.避免超長事務,影響效能及吞吐量,特別是一般業務在開啟事務時會加資料庫行級鎖,如果事務超長會影響其它事務的操作。
2.將回滾設定為:throwable,即對於任何throwable及其子類異常都能夠回滾。
3.加鎖一定要加有索引的記錄上,否則會導致表鎖
4.避免在事務中做耗時的io或其它操作
spring實現事務是做了乙個try catch,如果應用程式發生異常,並且是要回滾的異常則回滾。
無論是註解還是配置,最終都是aop**去做事務管理。
目的:方便事務管理
事務本身的問題:
a.髒讀
事務讀取了另乙個事務未提交的事務。
解決辦法:讀已提交的事務
c.不可重複讀
指乙個事務在兩個時間點讀取資料時,由於第二次讀取前資料被另外乙個事務修改因此出現兩次資料讀取不一致。
解決辦法:事務在讀取時,加資料庫行級鎖。
b.幻讀
指事務在第一次讀取行數時有100條,第二次讀取前,另乙個事務插入了一條,就變成了我101條。
解決辦法: 在這個事務做業務操作時,不允許插入事務,這種效能太差了。
事務幾個要點:
1.隔離級別
即事務可見性,spring提供:
a.read_uncommited:會出現髒讀,不可重複讀,幻像讀,
b.read_commited:解決了髒讀,會出現不可重複讀,幻像讀。
c.可重複讀隔離級別:解決髒讀,可重複讀問題,會出現幻像讀。
d.串形化,事務串形化執行:解決髒讀,不可重複讀,幻像讀。
2.傳播級別
a.required,
總是需要有乙個事務,沒有起乙個。
b.required_new,
總是另起乙個事務執行。
c.support,
支援事務,沒事務則以非事務執行。
d.not_support,
不支援,即使當前有事務也以非事務執行。
e.never
不支援事務,如果當前存在事務拋錯。
f.mandatory強制
必須要求有事務,沒有則拋錯。
g.nested
統一提交但是不統一回滾,可以理解成父子事務,提交一起提交,如果子事務失敗不影響父事務提交。父事務失敗影響子事務提交。
3.事務超時時間
一般設定成30秒
4.什麼異常要回滾
預設runtimexception,開發時注意設定為throwable
spring事務整理
1 預設使用資料庫的 mysql 可重複讀,oracle 已提交讀 2 未提交讀 執行緒t1 寫 和執行緒t2 讀 同時訪問一條資源資料,t1正在寫入資料事務還未提交的時候t2進行讀取,t2能讀取到t1未提交的資料,進而產生了髒讀 會出現髒讀 幻讀 不可重複讀 3 已提交讀 執行緒t1 寫 和執行緒...
Spring事務自行整理驗證
1 複習下事務的傳播機制,spring支援以下事務 傳播機制 propagation required 如果當前沒有事務,就新建乙個事務,如果已經存在乙個事務中,加入到這個事務中。這是最常見的選擇。propagation supports 支援當前事務,如果當前沒有事務,就以非事務方式執行。prop...
Spring事務(一) Spring事務的使用
事務的經典舉例 某人要在商店使用電子貨幣購買100元的東西,當中至少包括兩個操作 該人賬戶減少100元 商店賬戶增加100元 事務就是要確保以上兩個操作 都能完成 或者 一起取消,否則就會出現100元平白消失或出現的情況。摘自wiki spring事務有兩種方式 程式設計式事務管理 宣告式事務管理 ...