有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步, 认准 https://blog.zysicyj.top
全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java 面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。https://store.amazingmemo.com/chapterDetail/1685324709017001`
Spring 提供了两种主要的事务管理方式:
声明式事务管理
声明式事务管理 是 Spring 的默认事务管理方式,它把事务管理代码从业务方法中分离出来,通过配置方式工作。它支持注解和 XML 配置两种方式。
1. 注解方式
在 Java 类或方法上使用 @Transactional
注解来声明性地应用事务。此注解可以作用于类定义级别或者方法级别。当作用于类级别时,表示该类下的所有 public 方法都具备该类型的事务属性。
示例:
1 2 3 4 5 6
| @Transactional public class TransactionalService { public void executeAction() { } }
|
2. XML 方式
XML 声明配置需要在 Spring 的配置文件中使用 <tx:advice>
和 <aop:config>
元素来配置。
示例:
1 2 3 4 5 6 7 8 9 10
| <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*" propagation="REQUIRED"/> </tx:attributes> </tx:advice>
<aop:config> <aop:pointcut id="serviceOperation" expression="execution(* com.example.service.*.*(..))"/> <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceOperation"/> </aop:config>
|
编程式事务管理
编程式事务管理 意味着你需要在代码中管理事务。这种方式给予开发者更大的控制权,但同时也增加了代码复杂性。
Spring 提供 PlatformTransactionManager
接口来实现编程式事务管理,通常使用 TransactionTemplate
或直接使用 PlatformTransactionManager
。
使用 TransactionTemplate
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public class ProgrammaticallyTransactionalService { private final TransactionTemplate transactionTemplate;
@Autowired public ProgrammaticallyTransactionalService(PlatformTransactionManager transactionManager) { this.transactionTemplate = new TransactionTemplate(transactionManager); }
public Object someServiceMethod() { return transactionTemplate.execute(status -> { return null; }); } }
|
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| public class ProgrammaticallyTransactionalService { private final PlatformTransactionManager transactionManager;
@Autowired public ProgrammaticallyTransactionalService(PlatformTransactionManager transactionManager) { this.transactionManager = transactionManager; }
public Object someServiceMethod() { DefaultTransactionDefinition definition = new DefaultTransactionDefinition(); TransactionStatus status = transactionManager.getTransaction(definition); try { transactionManager.commit(status); } catch (Exception ex) { transactionManager.rollback(status); throw ex; } return null; } }
|
在这两种事务管理方式中,声明式事务管理 通常是更推荐的方式,因为它将事务管理从实际的业务代码中解耦出来,减少了开发者负担并且使得代码更加清晰。