1、預設使用資料庫的(mysql:可重複讀,oracle:已提交讀)
2、未提交讀
執行緒t1(寫)和執行緒t2(讀)同時訪問一條資源資料,t1正在寫入資料事務還未提交的時候t2進行讀取,t2能讀取到t1未提交的資料,進而產生了髒讀會出現髒讀、幻讀、不可重複讀
3、已提交讀
執行緒t1(寫)和執行緒t2(讀)同時訪問一條資源資料,t2會等t1的事務提交完再讀取,這個等待的過程會產生效能損耗,但是保證了資料的有效性避免了髒讀會出現幻讀、不可重複讀
4、可重複讀
執行緒t1(寫)和執行緒t2(讀)同時訪問一條資源資料,t2讀取這條資料的時候t1就需要等待,直到t2讀取完畢後,t1才能對這個資料做些操作,避免了不可重複讀會出現幻讀
5、序列化的 不會出現這3種問題
髒讀:查詢到另乙個事務未提交的資料
幻讀:查詢到另乙個事務insert的資料
不可重複讀:查到另乙個事務update的資料
@transactional(isolation = isolation.default)propagation_required(預設)
如果有事務就加入到這個事務中,沒事務新建乙個事務
propagation_supports
有事務就加入這個事務,沒事務就不開啟事務了
propagation_mandatory
有事務就加入這個事務,沒事務直接報錯
propagation_requires_new
新建乙個事務,如果已經有事務的話就先掛起來
propagation_not_supported
不使用事務,如果有就掛起來
propagation_never
不使用事務,如果有會報錯
propagation_nested
如果有事務就開啟乙個事務嵌進去,沒有的話就開啟乙個
有時候我們會發現明明使用了事務標籤但是事務不回滾,可能有一下幾種原因:
1、檢查你方法是不是public的
2、你的異常型別是不是unchecked異常
如果我想check異常也想回滾怎麼辦,註解上面寫明異常型別即可
@transactional(rollbackfor=exception.class)
類似的還有norollbackfor,自定義不回滾的異常
3、資料庫引擎要支援事務,如果是mysql,注意表要使用支援事務的引擎,比如innodb,如果是myisam,事務是不起作用的
4、是否開啟了對註解的解析
5、spring是否掃瞄到你這個包,如下是掃瞄到org.test下面的包
6、檢查是不是同乙個類中的方法呼叫(如a方法呼叫同乙個類中的b方法)
7、異常是不是被你catch住了
spring事務整理一
工作很多年了,整理下自己的知識體系。spring為了方便事務管理,提供了註解與xml配置事務的形式。業務中事務使用時注意點 1.避免超長事務,影響效能及吞吐量,特別是一般業務在開啟事務時會加資料庫行級鎖,如果事務超長會影響其它事務的操作。2.將回滾設定為 throwable,即對於任何throwab...
Spring事務自行整理驗證
1 複習下事務的傳播機制,spring支援以下事務 傳播機制 propagation required 如果當前沒有事務,就新建乙個事務,如果已經存在乙個事務中,加入到這個事務中。這是最常見的選擇。propagation supports 支援當前事務,如果當前沒有事務,就以非事務方式執行。prop...
Spring 事務 事務控制
0 註解 autowire 自動注入 url url b 1 spring專案中事務手動回滾 b transactionaspectsupport.currenttransactionstatus setrollbackonly 或者丟擲異常 transactional rollbackfor pu...