事务属性:
// 当前方法应用事务
@Transactional(
readOnly=false, // 读写的事务,当修改数据时候用;如果查询就设置为true
isolation=Isolation.DEFAULT, // 事务隔离级别
timeout=-1, // 事务执行的超时时间, -1 表示不超时
noRollbackFor=ArithmeticException.class, // 遇到指定的异常不回滚
propagation=Propagation.REQUIRES_NEW // 事务传播行为
)
事务传播行为:
REQUIRES_NEW:
如果上下文中已经存在事务A,则该事务A挂起,并启动一个新的事务B。 当事务B结束后,事务A被唤醒并继续执行
REQUIRED:
当前执行方法必须在事务环境下运行!如果调用当前方式时候已经有一个事务环境,当前执行方法会加入当前事务环境,就不开启新的事务;如果调用当前方法时候没有事务环境,就开启一个新的事务!
SUPPORTS:
支持事务环境! 如果当前方法没有事务,也可以运行!
Never:
当前方法不能再事务环境下运行!
案例:
插入部门信息,插入日志(日志)!
- t_log 日志表
- LogService.java 插入记录
REQUIRES_NEW
insertLog()
不管当前执行方法有没有事务环境,都开启新事务!
- DeptService.java
REQUIRED
Void save() {
// 日志提示: 在插入部门….
insertLog(); // 始终插入
int I = 1/0;
dao.save(); 调用dao的保存方法
}
讲解:
执行save方法时开启了一个新的事务环境,执行到“insertLog();”时又会开启一个新的事务环境; 当上一个事务环境发生异常时,不会造成新的事务进行回滚;所以无论如何插入日志都会成功