SpringBoot事務(wù)注解超詳細(xì)講解
@Transactional
spring 事務(wù)注解
1.簡(jiǎn)單開啟事務(wù)管理
@EnableTransactionManagement // 啟注解事務(wù)管理,等同于xml配置方式的 <tx:annotation-driven />
2.事務(wù)注解詳解
默認(rèn)遇到throw new RuntimeException(“…”);會(huì)回滾
需要捕獲的throw new Exception(“…”);不會(huì)回滾
指定回滾
@Transactional(rollbackFor=Exception.class) public void methodName() { // 不會(huì)回滾 throw new Exception("..."); }
指定不回滾
@Transactional(noRollbackFor=Exception.class) public ItimDaoImpl getItemDaoImpl() { // 會(huì)回滾 throw new RuntimeException("注釋"); }
如果有事務(wù),那么加入事務(wù),沒有的話新建一個(gè)(不寫的情況下)
@Transactional(propagation=Propagation.REQUIRED)
容器不為這個(gè)方法開啟事務(wù)
@Transactional(propagation=Propagation.NOT_SUPPORTED)
readOnly=true只讀,不能更新,刪除
@Transactional (propagation = Propagation.REQUIRED,readOnly=true)
設(shè)置超時(shí)時(shí)間
@Transactional (propagation = Propagation.REQUIRED,timeout=30)
設(shè)置數(shù)據(jù)庫隔離級(jí)別
@Transactional (propagation = Propagation.REQUIRED,isolation=Isolation.DEFAULT)
3.指定事務(wù)管理器
spring Boot 使用事務(wù)非常簡(jiǎn)單,首先使用注解 @EnableTransactionManagement 開啟事務(wù)支持后,然后在訪問數(shù)據(jù)庫的Service方法上添加注解 @Transactional 便可。
關(guān)于事務(wù)管理器,不管是JPA還是JDBC等都實(shí)現(xiàn)自接口 PlatformTransactionManager 如果你添加的是 spring-boot-starter-jdbc 依賴,框架會(huì)默認(rèn)注入 DataSourceTransactionManager 實(shí)例。如果你添加的是 spring-boot-starter-data-jpa 依賴,框架會(huì)默認(rèn)注入 JpaTransactionManager 實(shí)例。
你可以在啟動(dòng)類中添加如下方法,Debug測(cè)試,就能知道自動(dòng)注入的是 PlatformTransactionManager 接口的哪個(gè)實(shí)現(xiàn)類。
3.1 打印項(xiàng)目事務(wù)管理器
@EnableTransactionManagement // 啟注解事務(wù)管理,等同于xml配置方式的 <tx:annotation-driven /> @SpringBootApplication public class ProfiledemoApplication { @Bean public Object testBean(PlatformTransactionManager platformTransactionManager){ System.out.println(">>>>>>>>>>" + platformTransactionManager.getClass().getName()); return new Object(); } public static void main(String[] args) { SpringApplication.run(ProfiledemoApplication.class, args); } }
這些SpringBoot為我們自動(dòng)做了,這些對(duì)我們并不透明,如果你項(xiàng)目做的比較大,添加的持久化依賴比較多,我們還是會(huì)選擇人為的指定使用哪個(gè)事務(wù)管理器。
代碼如下:
3.2 指定事務(wù)管理器
@EnableTransactionManagement @SpringBootApplication public class ProfiledemoApplication { // 其中 dataSource 框架會(huì)自動(dòng)為我們注入 @Bean public PlatformTransactionManager txManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } @Bean public Object testBean(PlatformTransactionManager platformTransactionManager) { System.out.println(">>>>>>>>>>" + platformTransactionManager.getClass().getName()); return new Object(); } public static void main(String[] args) { SpringApplication.run(ProfiledemoApplication.class, args); } }
在Spring容器中,我們手工注解@Bean 將被優(yōu)先加載,框架不會(huì)重新實(shí)例化其他的 PlatformTransactionManager 實(shí)現(xiàn)類。
然后在Service中,被 @Transactional 注解的方法,將支持事務(wù)。如果注解在類上,則整個(gè)類的所有方法都默認(rèn)支持事務(wù)。
對(duì)于同一個(gè)工程中存在多個(gè)事務(wù)管理器要怎么處理,請(qǐng)看下面的實(shí)例,具體說明請(qǐng)看代碼中的注釋。
3.3 使用指定的事務(wù)管理器
@EnableTransactionManagement // 開啟注解事務(wù)管理,等同于xml配置文件中的 <tx:annotation-driven /> @SpringBootApplication public class ProfiledemoApplication implements TransactionManagementConfigurer { @Resource(name="txManager2") private PlatformTransactionManager txManager2; // 創(chuàng)建事務(wù)管理器1 @Bean(name = "txManager1") public PlatformTransactionManager txManager(DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } // 創(chuàng)建事務(wù)管理器2 @Bean(name = "txManager2") public PlatformTransactionManager txManager2(EntityManagerFactory factory) { return new JpaTransactionManager(factory); } // 實(shí)現(xiàn)接口 TransactionManagementConfigurer 方法,其返回值代表在擁有多個(gè)事務(wù)管理器的情況下默認(rèn)使用的事務(wù)管理器 @Override public PlatformTransactionManager annotationDrivenTransactionManager() { return txManager2; } public static void main(String[] args) { SpringApplication.run(ProfiledemoApplication.class, args); } } @Component public class DevSendMessage implements SendMessage { // 使用value具體指定使用哪個(gè)事務(wù)管理器 @Transactional(value="txManager1") @Override public void send() { System.out.println(">>>>>>>>Dev Send()<<<<<<<<"); send2(); } // 在存在多個(gè)事務(wù)管理器的情況下,如果使用value具體指定 // 則默認(rèn)使用方法 annotationDrivenTransactionManager() 返回的事務(wù)管理器 @Transactional public void send2() { System.out.println(">>>>>>>>Dev Send2()<<<<<<<<"); } }
總結(jié)
到此這篇關(guān)于SpringBoot事務(wù)注解超詳細(xì)講解的文章就介紹到這了,更多相關(guān)SpringBoot事務(wù)注解內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
spring boot udp或者tcp接收數(shù)據(jù)的實(shí)例詳解
這篇文章主要介紹了spring boot udp或者tcp接收數(shù)據(jù),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12基于Java SSM框架開發(fā)圖書借閱系統(tǒng)源代碼
本文給大家介紹了基于Java SSM框架開發(fā)圖書借閱系統(tǒng),開發(fā)環(huán)境基于idea2020+mysql數(shù)據(jù)庫,前端框架使用bootstrap4框架,完美了實(shí)現(xiàn)圖書借閱系統(tǒng),喜歡的朋友快來體驗(yàn)吧2021-05-05mybatis-plus自定義排序的實(shí)現(xiàn)
本文主要介紹了mybatis-plus自定義排序的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01SpringCloud組件OpenFeign之?dāng)r截器解讀
這篇文章主要介紹了SpringCloud組件OpenFeign之?dāng)r截器用法。具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-04-04Spring Boot動(dòng)態(tài)加載Jar包與動(dòng)態(tài)配置實(shí)現(xiàn)
隨著項(xiàng)目的不斷演進(jìn)和業(yè)務(wù)需求的增長,很多場(chǎng)景下需要實(shí)現(xiàn)系統(tǒng)的動(dòng)態(tài)性和靈活性,本文主要介紹了Spring Boot動(dòng)態(tài)加載Jar包與動(dòng)態(tài)配置實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2024-02-02