事务的特性
事务有ACID四个特点
1. A:代表原子性,比如说两个操作要么都成功要么都失败
2. C:代表一致性,比如说转账前后我都是200块,不管怎么操作都是200块。
3. I:代表隔离性,多个事务之前不能互相影响,做到隔离。
4. D:代表持久化,事务操作的结果,要永久保存到数据库中。
spring 创建事务的方式
1. 编程式事务
在 spring 中为了支持编程式事务,专门提供了一个类:TransactionTemplate,在它的 execute 方法中,就实现了事务的功能
优势:粒度小
@Autowired
private TransactionTemplate transactionTemplate;
...
public void save(final User user) {
queryData1();
queryData2();
transactionTemplate.execute((status) => {
addData1();
updateData2();
return Boolean.TRUE;
})
}
2. 声明式事务
基于@Transactional注解实现
优势:无代码入侵
spring的传播属性
| 事务传播机制 | 外部有事务 | 外部无事务 | 对事务的需求性 |
|---|---|---|---|
| required | 加入外部事务 | 开启 | 强 |
| required_now | 挂起外部事务,自己开启事务 | 开启 | 强 |
| support | 加入外部事务 | 不开启 | 中 |
| not_support | 挂起外部事务 | 不开启 | 弱 |
| never | 异常 | 不开启 | 弱 |
| mandtory | 加入外部事务 | 异常 | 强 |
| nested | 嵌套事务 | 开启 | 强 |
● required:当前的业务方法,如果外部不存在事务,就开启一个事务;如果外部存在事务,则加入该事务
● required_new:当前的事务方法,如果外部不存在事务,则开启一个事务;如果外部存在事务,则将该外部事务挂起,另外开启一个新的事务,执行该事务之后再将外部事务还原;
● supports:当前业务方法,如果外部不存在事务,则不开启事务;如果外部存在事务,则加入外部事务
● not_supported;当前业务方法,如果外部不存在事务,则不开启事务;如果外部存在事务,则直接挂起外部事务
● never:当前业务方法,外部一定不能存在事务,否则直接抛出异常
● mandator:当前业务方法外部必须存在事务,否则直接抛出异常
● nested:内嵌事务,在当前的事务中可以设置一个或多个保存点,可以进行回滚到指定的保存点
spring 事务失效的场景
1. 权限访问问题(使用非public 的权限)
2. 使用final 修饰的方法
3. 调用本类的方法(this)
4. 该对象未被spring 管理
5. 多线程调用
6. 手动 try...catch 了异常
7. 发生另类的异常(默认情况下只会回滚RuntimeException和Error)
8. 数据库引擎不支持事务