新建的spring boot
專案中,一般都會引用spring-boot-starter
或者spring-boot-starter-web
,而這兩個起步依賴中都已經包含了對於spring-boot-starter-jdbc
或spring-boot-starter-data-jpa
的依賴。 當我們使用了這兩個依賴的時候,框架會自動預設分別注入datasourcetransactionmanager
或jpatransactionmanager
。 所以我們不需要任何額外配置就可以用@transactional
註解進行事務的使用。
提示@transactional註解只能應用到public可見度的方法上,可以被應用於介面定義和介面方法,方法會覆蓋類上面宣告的事務。
例如使用者新增需要插入使用者表、使用者與崗位關聯表、使用者與角色關聯表,如果插入成功,那麼一起成功,如果中間有一條出現異常,那麼回滾之前的所有操作, 這樣可以防止出現髒資料,就可以使用事務讓它實現回退。
做法非常簡單,我們只需要在方法或類新增@transactional
註解即可。
@transactional
public int insertuser(user user)
@transactional
public int insertuser(user user) throws exception
return rows;
}
原因分析:因為spring
的預設的事務規則是遇到執行異常(runtimeexception)
和程式錯誤(error)
才會回滾。如果想針對檢查異常進行事務回滾,可以在@transactional
註解裡使用rollbackfor
屬性明確指定異常。
例如下面這樣,就可以正常回滾:
@transactional(rollbackfor = exception.class)
public int insertuser(user user) throws exception
return rows;
}
@transactional
public int insertuser(user user) throws exception
catch (exception e)
}return rows;
}
@transactional
public int insertuser(user user) throws exception
return rows;
}
transactional
註解的常用屬性表:
屬性說明
propagation
事務的傳播行為,預設值為 required。
isolation
事務的隔離度,預設值採用 default
timeout
事務的超時時間,預設值為-1,不超時。如果設定了超時時間(單位秒),那麼如果超過該時間限制了但事務還沒有完成,則自動回滾事務。
read-only
指定事務是否為唯讀事務,預設值為 false;為了忽略那些不需要事務的方法,比如讀取資料,可以設定 read-only 為 true。
rollbackfor
用於指定能夠觸發事務回滾的異常型別,如果有多個異常型別需要指定,各型別之間可以通過逗號分隔。
norollbackfor
丟擲 no-rollback-for 指定的異常型別,不回滾事務。
....
提示事務的傳播機制是指如果在開始當前事務之前,乙個事務上下文已經存在,此時有若干選項可以指定乙個事務性方法的執行行為。 即:在執行乙個@transactinal註解標註的方法時,開啟了事務;當該方法還在執行中時,另乙個人也觸發了該方法;那麼此時怎麼算事務呢,這時就可以通過事務的傳播機制來指定處理方式。
transactiondefinition
傳播行為的常量:
常量含義
transactiondefinition.propagation_required
如果當前存在事務,則加入該事務;如果當前沒有事務,則建立乙個新的事務。這是預設值。
transactiondefinition.propagation_requires_new
建立乙個新的事務,如果當前存在事務,則把當前事務掛起。
transactiondefinition.propagation_supports
如果當前存在事務,則加入該事務;如果當前沒有事務,則以非事務的方式繼續執行。
transactiondefinition.propagation_not_supported
以非事務方式執行,如果當前存在事務,則把當前事務掛起。
transactiondefinition.propagation_never
以非事務方式執行,如果當前存在事務,則丟擲異常。
transactiondefinition.propagation_mandatory
如果當前存在事務,則加入該事務;如果當前沒有事務,則丟擲異常。
transactiondefinition.propagation_nested
如果當前存在事務,則建立乙個事務作為當前事務的巢狀事務來執行;如果當前沒有事務,則該取值等價於transactiondefinition.propagation_required。
spring boot 的事務管理
方法一 註解的事物管理 在進行資料庫操作的時候就會遇到事務管理,插入的時候要加 transactional註解進行事務的回滾。兩個插入語句如果其中乙個執行失敗,則兩條插入語句都不能執行。方法二 spring配置檔案的事務管理,如上面 所示 1宣告式事務管理 1 配置事物管理器 2 配置註解驅動 3 ...
springboot事務管理詳解
隔離級別public enum isolationread uncommitted 該隔離級別表示乙個事務可以讀取另乙個事務修改但還沒有提交的資料。該級別不能防止髒讀和不可重複讀,因此很少使用該隔離級別。read committed 該隔離級別表示乙個事務只能讀取另乙個事務已經提交的資料。該級別可以...
springboot 事務管理例項
transactional spring 事務註解 1.簡單開啟事務管理 enabletransactionmanagement 啟註解事務管理,等同於xml配置方式的2.事務註解詳解 預設遇到throw new runtimeexception 會回滾 需要捕獲的throw new excepti...