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