一、事务业务描述
事务是一个不可分割逻辑工作单元,是一个业务,事务的处理通常要结合业务进行落地的实现。进而更好保证业务的完整性(要么都成功,要么都失败)。
二、Spring 中的事务控制
Spring中的事务控制,推荐在业务层基于AOP方式进行实现,这样可以将事务逻辑与业务逻辑进行更好的解耦,同时可以重用事务逻辑代码.进而简化大量事务模板代码的编写.
SpringBoot工程中的事务控制,可以直接在需要进行事务控制的类或业务方法上通过@Transaction注解描述即可,由此注解描述的方法为事务切入点方法,底层在切入点方法执行时会通过“通知方法”进行事务逻辑增强,示例代码如下:
1 @Transactional 2 public int updateObject(...){ 3 .... 4 }
当一个类中有个方法都需要事务控制,我们可以使用@Transactional注解对类进行描述,示例代码如下:
1 @Transactional 2 public class XxxServiceImpl implements XxxService{}
二、Spring 中的事务属性分析
在使用@Transactional描述类或方法时候,还可以指定一些事务属性,例如:
1) readOnly 用于描述此事务是否为只读事务,默认值是false(表示不是只读事务),对于查询而言建议设置值为true.
2) timeout 事务的超时时间,超过设置的时间会抛出异常,默认为-1(不超时,实际项目中建议设置超时时间)。
3) rollbackFor 设置出现什么异常时要回滚事务(默认为RuntimeException)。
4) isolation 设置事务并发执行时的隔离级别(隔离级别越高,数据正确性越好,但并发越差)。
5)propagation 设置事务的传播特性(默认值为Propagation.REQUIRED),不同业务对象之间的方法出现相互调用时,事务的执行策略。REQUIRED表示参与到调用者的事务中去,其它选项自行查阅。
案例分析:
1 @Transactional(readOnly = false, 2 rollbackFor = Throwable.class, 3 isolation = Isolation.READ_COMMITTED, 4 timeout = 5, 5 propagation= Propagation.REQUIRED) 6 public class XxxServiceImpl implements XxxService{}
说明,假如类和方法上都定义了事务特性,那方法上定义的事务特性优先级比较高。