spring Boot 使用事務(wù)非常簡(jiǎn)單,首先使用注解 @EnableTransactionManagement 開(kāi)啟事務(wù)支持后,然后在訪問(wèn)數(shù)據(jù)庫(kù)的Service方法上添加注解 @Transactional 便可。
關(guān)于事務(wù)管理器,不管是JPA還是JDBC等都實(shí)現(xiàn)自接口 PlatformTransactionManager 如果你添加的是 spring-boot-starter-jdbc 依賴(lài),框架會(huì)默認(rèn)注入 DataSourceTransactionManager 實(shí)例。如果你添加的是 spring-boot-starter-data-jpa 依賴(lài),框架會(huì)默認(rèn)注入 JpaTransactionManager 實(shí)例。
你可以在啟動(dòng)類(lèi)中添加如下方法,Debug測(cè)試,就能知道自動(dòng)注入的是 PlatformTransactionManager 接口的哪個(gè)實(shí)現(xiàn)類(lèi)。
1
2
3
4
5
6
7
8
9
10
11
12
|
@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)目做的比較大,添加的持久化依賴(lài)比較多,我們還是會(huì)選擇人為的指定使用哪個(gè)事務(wù)管理器。
代碼如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@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)類(lèi)。
然后在Service中,被 @Transactional 注解的方法,將支持事務(wù)。如果注解在類(lèi)上,則整個(gè)類(lèi)的所有方法都默認(rèn)支持事務(wù)。
對(duì)于同一個(gè)工程中存在多個(gè)事務(wù)管理器要怎么處理,請(qǐng)看下面的實(shí)例,具體說(shuō)明請(qǐng)看代碼中的注釋。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
@EnableTransactionManagement // 開(kāi)啟注解事務(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); } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@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()<<<<<<<<" ); } } |
注:
如果Spring容器中存在多個(gè) PlatformTransactionManager 實(shí)例,并且沒(méi)有實(shí)現(xiàn)接口 TransactionManagementConfigurer 指定默認(rèn)值,在我們?cè)诜椒ㄉ鲜褂米⒔?@Transactional 的時(shí)候,就必須要用value指定,如果不指定,則會(huì)拋出異常。
對(duì)于系統(tǒng)需要提供默認(rèn)事務(wù)管理的情況下,實(shí)現(xiàn)接口 TransactionManagementConfigurer 指定。
對(duì)有的系統(tǒng),為了避免不必要的問(wèn)題,在業(yè)務(wù)中必須要明確指定 @Transactional 的 value 值的情況下。不建議實(shí)現(xiàn)接口 TransactionManagementConfigurer,這樣控制臺(tái)會(huì)明確拋出異常,開(kāi)發(fā)人員就不會(huì)忘記主動(dòng)指定。
參考閱讀:
以上所述是小編給大家介紹的Spring Boot 事務(wù)的使用,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)服務(wù)器之家網(wǎng)站的支持!