Spring中的@Transactional注解使用详解
作者:小小懒懒
@Transactional 注解介绍
@Transactional 是一个注解,用于在 Spring 框架中管理事务的声明式事务管理机制。
它可以应用于方法或类级别,并指示方法或类在执行时应该被包装在一个事务中。
使用 @Transactional 注解的方法在执行时会被 Spring 框架自动处理事务的起始、提交或回滚等操作,简化了事务管理的编码工作。
- 当方法执行成功时,事务会被提交,数据的变更会持久化到数据库;
- 当方法执行失败时,事务会被回滚,之前的数据变更会被撤销。
@Transactional 注解的常见属性和行为
- propagation:指定事务的传播行为。它定义了事务方法被另一个事务方法调用时,事务应该如何传播。常用的传播行为包括 REQUIRED、REQUIRES_NEW、NESTED 等。
- isolation:指定事务的隔离级别。它定义了事务方法在并发环境中处理数据一致性的程度,包括 DEFAULT、READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ、SERIALIZABLE 等级别。
- readOnly:指定事务是否为只读。如果设置为 true,则表示事务只读,不会对数据进行修改。这样可以提高数据库的读取性能。
- timeout:指定事务的超时时间(以秒为单位)。如果事务执行时间超过指定的超时时间,事务将被回滚。
- rollbackFor 和 noRollbackFor:用于指定在遇到特定的异常时事务是否回滚。可以设置特定的异常类,或者使用异常类的父类或接口。
- rollbackOn 和 noRollbackOn:与 rollbackFor 和 noRollbackFor 类似,用于指定在遇到特定的异常类型时事务是否回滚,但使用的是异常类的名字字符串。
- value 和 transactionManager:用于指定事务管理器的名称。如果应用中存在多个事务管理器,可以通过这两个属性指定使用哪个事务管理器。
以下是一个示例代码,展示了 @Transactional 注解的使用:
@Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, readOnly = false) public void saveOrder(Order order) { // 保存订单的逻辑 // ... } @Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.READ_COMMITTED) public void updateProductQuantity(String productId, int quantity) { // 更新产品库存的逻辑 // ... }
在上述示例中,saveOrder 方法和 updateProductQuantity 方法都被 @Transactional 注解修饰,表示它们会在事务中执行。
saveOrder 方法使用默认的传播行为和隔离级别,而 updateProductQuantity 方法指定了传播行为为 REQUIRED,隔离级别为 READ_COMMITTED。
需要注意的是,@Transactional 注解只能应用于公共方法。当调用被注解的方法时,事务的生效是通过 Spring AOP 实现的,所以该注解需要在 Spring 管理的 Bean 中才能生效。
同时,建议将 @Transactional 注解应用在业务层而非持久层,以便事务的粒度更加明确和控制。
总结
要知道@Transactional注解里面每个属性的含义。@Transactional注解属性就是来控制事务属性的。通过这些属性来生成事务。
要明确我们添加的@Transactional注解会不会起作用。
@Transactional注解在外部调用的函数上才有效果,内部调用的函数添加无效,要切记。这是由AOP的特性决定的。
要明确事务的作用范围,有@Transactional的函数调用有@Transactional的函数的时候,进入第二个函数的时候是新的事务,还是沿用之前的事务。稍不注意就会抛UnexpectedRollbackException异常。
到此这篇关于Spring中的@Transactional注解使用详解的文章就介绍到这了,更多相关@Transactional注解使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!