事务
保证数据的完整行和一致性的技术,被事务管理的动作。
事务的四种特性
- 原子性:要么都成功,要么都失败。
- 一致性:事务开始之前和事务开始之后,数据都是完整的。
- 持久性:事务开始后,所影响很长远。
- 隔离性:多个事务会处理相同的数据,应该每个事务都会与其他事务相隔离,防止数据损坏。
- 读取为提交:允许一个事务读取该事务为 提交的数据。
- 读取已提交:A事务主要比B事务先处理完数据可以进行读取。(不可重复读)
- 可重复读:A事务在开始读的时候,不允许其他事务进行修改。
- 串行化:所有事务处理顺序化(每次读都需要获得标记共享锁)。
脏读、不可重复读、幻读
- 脏读:一个事务读取到另一个事务未提交的更新数据。
- 不可重复读:在同一个事务中多次读取同一个数据返回的结果有所不同,后续读取可以读到另一个事务已提交的更新数据,“可重复读”在同一事务中多次读取数据时,能够保证所读的数据一样,也就是后续读取到另一事务已提交的更新数据。
- 幻读:查询表中一条数据如果不存在就插入一条,并发的时候会发现,里面有两条相同的数据。
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读取未提交 | 可能 | 可能 | 可能 |
读取已提交 | 不可能 | 可能 | 可能 |
可重复读 | 不可能 | 不可能 | 可能 |
串行化 | 不可能 | 不可能 | 不可能 |
本地事务 @Transactional
底层实现原理其实是AOP切面编程,来实现共享连接
什么情况下事务会失效?
- 数据库不支持事务会失效(例如mysql5.7版本及以前 使用的是MyIsAm存储引擎)。
- service类没有被Spring管理。(如果没有被管理,会变成Spring Bean)。
- 内部调用(不带事务的方法调用类中带事务的方法,不会回滚)。
- 使用默认的事务处理方式。默认对运行时异常进行回滚,可加上Rollbackfor进行指定。
- 事务只能用于public方法,如果在protected、private或者默认可见性的方法上面使用会被忽略,也不会抛出任何异常。
- 数据源没有配置事务管理器。