Spring事務自行整理驗證

2021-10-23 22:28:51 字數 1767 閱讀 1284

1、複習下事務的傳播機制,spring支援以下事務:

傳播機制:

propagation_required:

如果當前沒有事務,就新建乙個事務,如果已經存在乙個事務中,加入到這個事務中。這是最常見的選擇。

propagation_supports:

支援當前事務,如果當前沒有事務,就以非事務方式執行。

propagation_mandatory:

使用當前的事務,如果當前沒有事務,就丟擲異常。

propagation_requires_new:

新建事務,如果當前存在事務,把當前事務掛起。

propagation_not_supported:

以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

propagation_never:

以非事務方式執行,如果當前存在事務,則丟擲異常。

propagation_nested:

如果當前存在事務,則在巢狀事務內執行。如果當前沒有事務,則執行與propagation_required類似的操作。

2、分析spring進行**的大概原理:

說明:spring 在掃瞄bean的時候會掃瞄方法上是否包含@transactional註解,如果包含,spring會為這個bean動態地生成乙個子類(即**類,proxy),**類是繼承原來那個bean的。此時,當這個有註解的方法被呼叫的時候,實際上是由**類來呼叫的,**類在呼叫之前就會啟動transaction。然而,如果這個有註解的方法是被同乙個類中的其他方法呼叫的,那麼該方法的呼叫並沒有通過**類,而是直接通過原來的那個bean,所以就不會啟動transaction,我們看到的現象就是@transactional註解無效。

提問:

為什麼乙個方法a()呼叫同乙個類中另外乙個方法b()的時候,b()不是通過**類來呼叫的呢?可以看下面的例子(為了簡化,用偽**表示)

@service

class a

method a()}

//spring掃瞄註解後,建立了另外乙個**類,並為有註解的方法插入乙個starttransaction()方法:

class proxy$a

method a()

}

當我們呼叫a的bean的a()方法的時候,也是被proxy$a攔截,執行proxy$a.a()(標記3),然而,由以上**可知,這時候它呼叫的是objecta.a(),也就是由原來的bean來呼叫a()方法了,所以**跑到了「標記1」。由此可見,「標記2」並沒有被執行到,所以starttransaction()方法也沒有執行。

1、在同乙個類中,事務方法之間的巢狀呼叫,僅看入口方法是否有開啟事務,有的話僅會開啟乙個事務。

2、spring採用動態**機制來實現事務控制,而動態**最終都是要呼叫原始物件的,只是在呼叫之前**會對入口發放執行之前進行一些增強處理,所以原始物件在去呼叫其他巢狀的方法是,是不會去出發**的。

呼叫本類方法使用:aopcontext.currentproxy()

@service

public class myservice

@transactional

public void insertuser()

}

以上僅為個人紀錄,如有不足請提意見,切勿噴!!!!!!

spring事務整理

1 預設使用資料庫的 mysql 可重複讀,oracle 已提交讀 2 未提交讀 執行緒t1 寫 和執行緒t2 讀 同時訪問一條資源資料,t1正在寫入資料事務還未提交的時候t2進行讀取,t2能讀取到t1未提交的資料,進而產生了髒讀 會出現髒讀 幻讀 不可重複讀 3 已提交讀 執行緒t1 寫 和執行緒...

spring事務整理一

工作很多年了,整理下自己的知識體系。spring為了方便事務管理,提供了註解與xml配置事務的形式。業務中事務使用時注意點 1.避免超長事務,影響效能及吞吐量,特別是一般業務在開啟事務時會加資料庫行級鎖,如果事務超長會影響其它事務的操作。2.將回滾設定為 throwable,即對於任何throwab...

Selenium自行整理 十

webdriver 支援 firefox firefoxdriver ie internetexplorerdriver opera operadriver 和 chrome chromedriver 對 safari 的支援由於技術限制在本版本中未包含,但是可以使用 selenesecommand...