spring事務傳播行為與事務隔離等級

2022-09-15 05:12:11 字數 3926 閱讀 6539

propagation屬性的傳播行為:

required:指定當前方法必需在事務環境中執行,如果當前有事務環境就加入當前正在執行的事務環境,如果當前沒有事務,就新建乙個事務。這是預設值。 

supports:指定當前方法加入當前事務環境,如果當前沒有事務,就以非事務方式執行。 

mandatory:指定當前方法必須加入當前事務環境,如果當前沒有事務,就丟擲異常。 

requires_new:指定當前方法總是會為自己發起乙個新的事務,如果發現當前方法已執行在乙個事務中,則原有事務被掛起,我自己建立乙個屬於自己的事務,直我自己這個方法commit結束,原先的事務才會恢復執行。 

not_supported:指定當前方法以非事務方式執行操作,如果當前存在事務,就把當前事務掛起,等我以非事務的狀態執行完,再繼續原來的事務。 

never:指定當前方法絕對不能在事務範圍內執行,如果方法在某個事務範圍內執行,容器就拋異常,只有沒關聯到事務,才正常執行。 

nested:指定當前方法執行時,如果已經有乙個事務存在,則執行在這個巢狀的事務中.如果當前環境沒有執行的事務,就新建乙個事務,並與父事務相互獨立,這個事務擁有多個可以回滾的保證點。就是指我自己內部事務回滾不會對外部事務造成影響,只對datasourcetransactionmanager事務管理器起效。

isolation level(事務隔離等級)

default:採用資料庫預設隔離級別 

serializable:最嚴格的級別,事務序列執行,資源消耗最大; 

repeatable_read:保證了乙個事務不會修改已經由另乙個事務讀取但未提交(回滾)的資料。避免了「髒讀取」和「不可重複讀取」的情況,但是帶來了更多的效能損失。 

read_committed:大多數主流資料庫的預設事務等級,保證了乙個事務不會讀到另乙個並行事務已修改但未提交的資料,避免了「髒讀取」。該級別適用於大多數系統。 

read_uncommitted:保證了讀取過程中不會讀取到非法資料。隔離級別在於處理多事務的併發問題。

為什麼事務要有isolation level這個屬性?先回顧下資料庫事務的知識: 

第一類丟失更新(lost update):在完全未隔離事務的情況下,兩個事物更新同一條資料資源,某一事物異常終止,回滾造成第乙個完成的更新也同時丟失。 

第二類丟失更新(second lost updates):是不可重複讀的特殊情況,如果兩個事務都讀取同一行,然後兩個都進行寫操作,並提交,第乙個事務所做的改變就會丟失。 

髒讀(dirty read):如果第二個事務查詢到第乙個事務還未提交的更新資料,形成髒讀。因為第乙個事務你還不知道是否提交,所以資料不一定是正確的。 

虛讀(phantom read):乙個事務執行兩次查詢,第二次結果集包含第一次中沒有或者某些行已被刪除,造成兩次結果不一致,只是另乙個事務在這兩次查詢中間插入或者刪除了資料造成的。 

不可重複讀(unrepeated read):乙個事務兩次讀取同一行資料,結果得到不同狀態結果,如中間正好另乙個事務更新了該資料,兩次結果相異,不可信任。

常用事物配置

<

tx:adviceid=

"txadvice"

transaction-manager

="txmanager"

>

<

tx:attributes

>

<

tx:method

name

="s**e*"

propagation

="required"

/>

<

tx:method

name

="add*"

propagation

="required"

/>

<

tx:method

name

="create*"

propagation

="required"

/>

<

tx:method

name

="insert*"

propagation

="required"

/>

<

tx:method

name

="update*"

propagation

="required"

/>

<

tx:method

name

="merge*"

propagation

="required"

/>

<

tx:method

name

="del*"

propagation

="required"

/>

<

tx:method

name

="remove*"

propagation

="required"

/>

<

tx:method

name

="put*"

propagation

="required"

/>

<

tx:method

name

="get*"

propagation

="supports"

read-only

="true"

/>

<

tx:method

name

="count*"

propagation

="supports"

read-only

="true"

/>

<

tx:method

name

="find*"

propagation

="supports"

read-only

="true"

/>

<

tx:method

name

="list*"

propagation

="supports"

read-only

="true"

/>

<

tx:method

name

="*"

propagation

="supports"

read-only

="true"

/>

<

tx:method

name

="batchs**eorupdate"

propagation

="requires_new"

/>

tx:attributes

>

tx:advice

>

<

aop:config

>

<

aop:pointcutid=

"txpointcut"

expression

="execution(* cn.j**ass..service.*.*(..))"

/>

<

aop:advisor

advice-ref

="txadvice"

pointcut-ref

="txpointcut"

/>

aop:config

>

spring 事務傳播行為

事務傳播行為種類 spring在transactiondefinition介面中規定了7種型別的事務傳播行為,它們規定了事務方法和事務方法發生巢狀呼叫時事務如何進行傳播 事務傳播行為型別 事務傳播行為型別 說明propagation required 如果當前沒有事務,就新建乙個事務,如果已經存在乙...

Spring事務傳播行為

你們說一下什麼是傳播行為,有幾種傳播行為,是不是有7種傳播行為,你們看一段 就知道傳播行為是怎麼用的,它是產生在 多個事務中,我定義乙個 class userservice 這個行為你不會不知道,行為是基礎知識,userdao.add 是不是這樣的,我在add方法上加上註解,logservice.a...

Spring事務傳播行為

什麼是spring事務傳播行為?事務傳播行為用來描述由某乙個事務傳播行為修飾的方法被巢狀進另乙個方法的時,事務如何傳播。假設servicea 中方法a 呼叫 serviceb中方法 b b被事務修飾 那麼會有兩種情況 方法a有事務,方法b有事務 方法a沒有事務,方法b有事務 spring中的事務傳播...