事務除錯心得

2021-08-03 14:47:51 字數 2498 閱讀 9244

真正的掌握應該是建立在行動的基礎之上的,正所謂光說不做假把式,以下便談談對事務除錯的心得。

1、問題背景

uat測試環境出現單元格

1+單元格

2=單元格

3,單元格

1沒資料,單元格

2沒資料,但是單元格

3卻有資料,後台查**邏輯發現有乙個

update

開頭的service

方法呼叫了

get開頭的

service

方法,重要的是這兩個

service

方法在xml

配置檔案

aop配置的時候,配置了兩個切面,被分別配置到了不同的切面上,所以猜想可能的原因是執行

update

開頭的service

方法時插入資料的時候是乙個時候,呼叫

get開頭的

service

方法時重新建立了乙個事務,由於事務的隔離性,所有導致兩個事務的資料不一致,將

get開頭的切面注釋,正常顯示,進一步驗證了是事務引起的原因。

2、問題分析

在本地開發環境分別在兩個

aop所配置的

service

下面,分別建立了乙個測試的

service

類,模擬以上發生的場景,寫乙個方法呼叫

update

開頭的service

方法,然後在這個方法裡面再呼叫另乙個

update

開頭的service

方法,測試發現,

update

方法裡插入一條資料,另乙個切面的

update

方法執行查詢可以查到資料,矛盾點就出現了,那麼測試環境的是什麼原因呢?

aop事務有組合切點的配置方式,分別為

and,or,!,

跟邏輯運算子的意思一樣,如果配了

and,則需要滿足兩則才會攔截方法進行事務的控制,

or則是有乙個滿足就會進行事務的控制,這個方式似乎跟配置成多個切面的方式是一樣的,!則是相反的邏輯判斷。那麼由此分析問題似乎不在組合配置這邊。

1、幻想讀(即兩個並行的事務,乙個事務先查詢沒有資料,另乙個事務插入了一條資料並提交,再用之前的事務查詢,發現返回的資料結果集多了一條資料,產生了幻讀的現象);

2、不可重複讀(兩個並行的事務,乙個事務先查詢資料,乙個事務修改了某條資料,再用這個事務查詢,發現資料不一致,產生了不可重複讀現象);

3、髒讀(指兩個並行事務,乙個事務插入一條資料但未提交,另乙個事務能讀取到未提交的事務)。分析猜想本地現象與測試環境不一致的原因有可能是資料庫設定的隔離級別不一致,四種事務隔離級別如下:(1

)read uncommitted 幻想讀、不可重複讀和髒讀都允許;

(2)read committed 允許幻想讀、不可重複讀,不允許髒讀;

(3)repeatable read 允許幻想讀,不允許不可重複讀和髒讀;

(4)serializable 幻想讀、不可重複讀和髒讀都不允許。

過set  transaction isolation level [read uncommitted

|read committed

|repeatable read

|serializable]發現

oracle

資料庫只能設定(

2)和(

4),由此可否定未提交的事務出現髒讀的現象,本地測試就算把它設定成(

2),還是可以讀取到未提交事務的資料。

接下來只能繼續除錯**了,用了好幾種方式後,又去研究了事務的傳播特性,發現事務有七個特性分別為(1)propagation_mandatory(2)propagation_required(3)propagation_never(4)propagation_not_support(5)propagation_supports

(6)propagation_requires_new(7)propagation_requires;

發現配置檔案中update*的事務傳播特性是配置成

required,get*是配置成not_support,update配置的意思是如果當前有事務則加入到當前事務,否則建立乙個事務。not_support的意思是如果有事務則會將當前事務掛起,去執行無事務的操作。由此可以猜想上述問題的原因很有可能是update先執行方法後,建立了乙個事務,當前事務插入了未提交的資料,

get方法執行時又將資料掛起查詢,導致資料查詢不到,本地測試果真如此,也就能解釋本地和測試環境的問題了。

3、解決方案

由於get查詢方法是不需要事務的,但存在一種場景也就是某個事務先

insert

一條語句,這個方法又需要去查詢這條未提交的資料,那麼這個

get查詢方法如果不用事務則就會產生上述資料不一致的問題,查詢傳播特性發現supports可滿足要求,如果當前沒有事務,則直接無事務查詢,否則直接用當前事務查詢,則不會有資料不一致的問題。

spring事務心得積累

一 使用事務 1 spring配置檔案中開啟事務註解機制 2 在方法上使用 transactional註解來使用事務 二 使用事務注意事項 1 只能在乙個類中呼叫另乙個類中的事務方法。2 事務預設對 runtimeexception進行回滾,用rollbackfor exception.class可...

spring事務心得積累

一 使用事務 1 spring配置檔案裡開啟事務註解機制 2 在方法上使用 transactional註解來使用事務 二 使用事務注意事項 1 僅僅能在乙個類中呼叫還有乙個類中的事務方法。2 事務預設對 runtimeexception進行回滾,用rollbackfor exception.clas...

Flex 除錯心得小結

原來在flex 除錯的時候 開始的時候在初始化的時候呼叫 terminalpanel.init 方法 可是總是報錯 因為它裡面用到乙個ip.xml 後來才知道是因為 loadip 內部採用了urlrequest 方法非同步載入ip.xml 檔案 所以會報空指標 所以後來改為在loadip 的 裡面的...