spring事務整理

2021-09-10 03:43:38 字數 1583 閱讀 2222

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...