事务管理
作者:唐亚峰 | battcn
字数统计:816 字
事务注解只能应用到公共可见度的方法上,可以被应用于接口定义和接口方法,方法会覆盖类上面声明的事务。
如果使用数据源隔离或者多数据源请用 @DSTransactional
反之用 @Transactional
或者 @DSTransactional
都可以
案例讲解
例如用户新增需要插入用户表、用户与角色关联表,如果插入成功,那么一起成功,如果中间有一条出现异常,那么回滚之前的所有操作。
为了防止出现脏数据,就需要借助 Spring 事务管理器来让它实现回退。
单一数据源
java
@Transactional
public void add(User user){
// 新增用户信息
userMapper.insert(user);
// 新增用户与角色管理
roleMapper.insert(role);
}
动态数据源
注意
动态数据源或者多数据必须用它,不然事务不会生效
java
@DSTransactional
public void add(User user){
// 新增用户信息
userMapper.insert(user);
// 新增用户与角色管理
roleMapper.insert(role);
}
事务特性
更多事务的内容可以自行 Google
或者看 Spring
官方文档
属性 | 说明 |
---|---|
propagation | 事务的传播行为,默认值为 REQUIRED。 |
isolation | 事务的隔离度,默认值采用 DEFAULT |
timeout | 事务的超时时间,默认值为-1,不超时。如果设置了超时时间(单位秒),那么如果超过该时间限制了但事务还没有完成,则自动回滚事务。 |
read-only | 指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true。 |
rollbackFor | 用于指定能够触发事务回滚的异常类型,如果有多个异常类型需要指定,各类型之间可以通过逗号分隔。 |
noRollbackFor | 抛出 no-rollback-for 指定的异常类型,不回滚事务。 |
提示
事务的传播机制是指如果在开始当前事务之前,一个事务上下文已经存在,此时有若干选项可以指定一个事务性方法的执行行为。 即:在执行一个@Transactinal注解标注的方法时,开启了事务;当该方法还在执行中时,另一个人也触发了该方法;那么此时怎么算事务呢,这时就可以通过事务的传播机制来指定处理方式。
TransactionDefinition
传播行为的常量:
常量 | 含义 |
---|---|
TransactionDefinition.PROPAGATION_REQUIRED | 事务的传播行为,默认值为 REQUIRED。 |
TransactionDefinition.PROPAGATION_REQUIRES_NEW | 事务的隔离度,默认值采用 DEFAULT |
TransactionDefinition.PROPAGATION_SUPPORTS | 事务的超时时间,默认值为-1,不超时。如果设置了超时时间(单位秒),那么如果超过该时间限制了但事务还没有完成,则自动回滚事务。 |
TransactionDefinition.PROPAGATION_NOT_SUPPORTED | 指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true。 |
TransactionDefinition.PROPAGATION_NEVER | 用于指定能够触发事务回滚的异常类型,如果有多个异常类型需要指定,各类型之间可以通过逗号分隔。 |
TransactionDefinition.PROPAGATION_MANDATORY | 抛出 no-rollback-for 指定的异常类型,不回滚事务。 |
TransactionDefinition.PROPAGATION_NESTED | 抛出 no-rollback-for 指定的异常类型,不回滚事务。 |