配置檔案:
value=
>
class
=
>
上面配置的意思就是配置面向切面,只要servcie中的方法丟擲exception,那麼insert,update,delete的sql方法都會回滾。測試時,可以在service方法中故意丟擲乙個異常,throw new exception("test"); 那麼資料庫就不會執行成功。所以在開發時,如果需要對多張表進行操作,而又需要保持事務的一致性的時候,我們就可以把對多張表的操作,寫在乙個service中的方法中,這樣如果有一張表執行失敗,丟擲異常,其他表的操作也會跟著回滾。
引數說明
readonly
是否是唯讀事務,true表示唯讀,false表示讀寫
timeout
事務超時秒數,預設值-1表示永不超時
isolation
隔離級別,例如(isolation = isolation.read_uncommitted)
propagation
事務傳播行為,見表propagation說明,例如@transactional(propagation=propagation.required)
rollbackfor
需要回滾的異常類陣列,例如
單一異常類:@transactional(rollbackfor=runtimeexception.class)
多個異常類:@transactional(rollbackfor=)
norollbackfor
不需要進行回滾的異常類陣列,......
rollbackforclassname
需要進行回滾的異常類名稱陣列,例如
單一異常類名稱:@transactional(rollbackforclassname="runtimeexception")
多個異常類名稱:@transactional(rollbackforclassname=)
norollbackforclassname
不需要進行回滾的異常類名稱陣列,......
引數說明
required
有事務,加入事務,沒有新建乙個
not_supported
以非事務方式執行操作,如果當前存在事務,就把當前事務掛起
requires_new
新建事務,如果當前存在事務,把當前事務掛起
mandatory
使用當前的事務,如果當前沒有事務,就丟擲異常
never
以非事務方式執行,如果當前存在事務,則丟擲異常
supports
支援當前事務,如果當前沒有事務,就以非事務方式執行
nested
如果當前存在事務,則在巢狀事務內執行,如果當前沒有事務,則執行與required類似的操作
q:我們的工程裡,事務的開啟跟關閉是由spring負責的,但具體的sql語句卻是由mybatis執行的。那麼問題來了,mybatis怎麼保證自己執行的sql語句是處在spring的事務上下文中?
仔細思考一下這個過程,@transactional是由spring進行處理的,spring做的事情是從資料來源(一般為資料庫連線池,比如說druid,c3p0等)獲取乙個資料庫連線,然後在進入方法邏輯前執行setautocommit(false)操作,最後在處理成功或者出現異常的時候分別執行commit或者rollback操作。
那麼問題來了,開啟跟結束事務是由spring獲取到資料庫連線以後進行操作的,但我們實際執行的update或者insert語句卻是由mybatis獲取資料庫連線進行操作的,可以想到如果想讓事務生效,那麼spring跟mybatis使用的必須是同乙個連線,真實情況是什麼樣呢?它們之間如何進行無縫銜接?讓我們通過原始碼來分析一下。
spring事務註解
transactional只能被應用到public方法上,對於其它非public的方法,如果標記了 transactional也不會報錯,但方法沒有事務功能.spring使用宣告式事務處理,預設情況下,如果被註解的資料庫操作方法中發生了unchecked異常,所有的資料庫操作將rollback 如果...
spring 事務註解
spring 事務註解 預設遇到throw new runtimeexception 會回滾 需要捕獲的throw new exception 不會回滾 指定回滾 transactional rollbackfor exception.class public void methodname 指定不...
spring事務註解
transactional只能被應用到public方法上,對於其它非public的方法,如果標記了 transactional也不會報錯,但方法沒有事務功能.spring使用宣告式事務處理,預設情況下,如果被註解的資料庫操作方法中發生了unchecked異常,所有的資料庫操作將rollback 如果...