Spring中的事務管理

2022-01-23 02:59:26 字數 2908 閱讀 3093

<

bean

id="transactionmanager"

class

="org.springframework.jdbc.datasource.datasourcetransactionmanager"

>

<

property

name

="datasource"

ref="datasource"

/>

bean

>

建立事務bean,配置資料來源屬性

<

tx:annotation-driven

transaction-manager

="transactionmanager"

/>

事務註解驅動

@transactional

public

void

hastraninsertdata()

public

void

nothastraninsertdata()

以上可以看出上面的資料回滾了,而下面的儲存到資料庫了。

required

如果現有的事務正在進行,當前方法應該在這個事務中執行,否則它該啟動新事務,並在自己的十五中執行。

requires_new

當前方法必須啟動新事務,並在自己的事務中執行,如果現有的事務正在進行,它應該掛起。

supports

如果現有事務正在進行,當前方法應該執行在該事務中,否則它沒有必要執行在事務中。

not_supported

當前方法不應該執行在事務中,如果現有事務正在執行,它應該掛起。

mandatory

當前方法必須執行於事務中,如果沒有事務在進行中,將丟擲乙個異常。

never

當前方法不應該執行於事務中,如果現有事務在執行中,將丟擲乙個異常。

nested

如果現有事務正在進行,當前方法應該執行在巢狀的事務中,否則它應該啟動乙個新事務並執行在自己的事務之中。

例如:

@override

@transactional

public

void

nestedbook()

catch

(exception e)

}}

@override

@transactional(propagation=propagation.nested)

public

void nestedaccount(int

i) }

這裡乙個required事務去呼叫nested事務,nested特性是在巢狀的事務裡,如果發生異常他只會回滾他自己的事務,而不會影響呼叫他的事務。

他與requires_new的區別是,前面方法沒有事務是每次需要建立自己的事務,如果前面有事務時,前面方法如果報錯了會回滾所有操作,而requires_new不會回滾操作。

nested的好處在於既能保證前者方法拋異常時所有資料能回滾,也能保證後者方法乙個拋異常不會影響後續的操作,只會回滾後者操作失敗的資料。

default

使用底層資料庫的預設隔離級別。對於大部分資料庫,預設隔離級別是read_commited,mysql是repeatable_read

read_uncommited

允許事務讀取其他事務的未提交修改。可能發生髒讀資料、不可重複讀幻讀問題。

read_commited 

僅允許事務讀取其他事務已經提交的修改。能夠避免髒讀資料問題,但是不可重複讀幻讀問題仍然可能發生。

repeatable_read

確保事務能夠多次從乙個欄位讀到相同值。在本事務期間,其他事務的更新被禁止。能夠避免髒讀資料和不可重複讀問題,但是幻讀問題仍然可能發生。

serializable

確保乙個事務能從表中多次讀取相同的行。在事務期間,其他事務做出的對該錶插入、更新和刪除將被禁止。能避免所有併發性問題,但是效能將會很

預設情況下,只有非受控異常(也就是runtimeexceptionerror型別)將導致事務回滾,而受控異常不會。

@override

@transactional

public

void hastraninsertdata() throws

filenotfoundexception, classnotfoundexception

catch

(exception e)

}

嚴重警告:上面的這段**是不會回滾的,就因為丟擲的異常時受控異常

rollbackfor:會發生回滾的異常

norollbackfor:不會發生回滾的異常

將@transaction變為下面這樣

@transactional(rollbackfor=filenotfoundexception.class, norollbackfor=classnotfoundexception.class)

改變之後就會進行回滾

如果丟擲的異常改為

throw

new classnotfoundexception("錯誤");

則又不會回滾

timeout:表示事務在被強制回滾之前存活的時間。這能夠避免長時間的事務占用資源。

Spring中事務管理

spring提供的事務管理可以分為兩類 程式設計式的和宣告式的。程式設計式的,比較靈活,但是 量大,存在重複的 比較多 宣告式的比程式設計式的更靈活。傳統使用jdbc的事務管理 以往使用jdbc進行資料操作,使用datasource,從資料來源中得到connection,我們知道資料來源是執行緒安全...

Spring中事務管理

一 事務 1.事務邏輯上的一組操作,組成這組操作的各個邏輯單元,要麼一起成功,要麼一起失敗 2.事務特性 1 原子性 強調事務的不可分割 2 一致性 事務的執行的前後資料的完整性保持一致 3 隔離性 乙個事務執行過程中,不應該收到其他事務的干擾 4 永續性 事務一旦結束,資料就持久到資料庫中 3.事...

spring中的事務管理

一 簡單介紹 spring中的事務管理主要是用來管理對資料庫進行操作的事務,一般是應用於service層。分為幾種 1.程式設計式事務管理 如jdbc中設定取消資料庫的自動提交功能 conn datasource.getconnection conn.setautocommit false 此處表示...