Spring事务学习
1.什么是事务
事务是指访问并操作数据库中数据项的一个程序执行单元,在逻辑上是一组操作,要么一起执行,要么都不执行。(事务也可以指一组SQL语句的集合)
2.事务的ACID原则
ACID的4个重要特性:
原子性
一个事务内的操作要么都执行,要么都不执行
例子:A/B两个容器中,共有100ml水,A倒给B10ml,B接收A倒给它的10ml,A倒水这个操作和B接水这个操作要么都执行,要么都不执行
一致性
事务的执行会使数据由一个状态变为另外一个状态,但是对于整个数据的完整性保持稳定
例子:在理想状态下,一个杯子有100ml水,将杯子里的水冻成冰,冰又化成水,都不会改变水的多少
隔离性
事务允许多个用户对同一个数据进行并发访问,而不破坏数据的完整性、正确性
例子:A、B两个人同时在淘宝购物,当最后一件商品被A、B同时购买时,如果A加购了这件商品,那么B必须等待A的决定,A选择购买,则B无法购买,A选择不购买,这间商品便回归商品列表,重新被他人选择
持久性
事务一旦提交,那么对数据库的改变会被记录,存储起来,其他操作不会对他产生影响
例子:在淘宝购物,只要购买过该商品,购买记录即刻产生,即使选择退货,那么他的购买记录还是存在
3.事务隔离
没有定义事务个隔离会产生问题
脏读、不可重复读、幻读(虚读)
脏读:一个事务中读取到另一个事务修改的【未提交的数据】,导致多次读取数据不一致
不可重复读:一个事务正在读取时,另一个事务修改了【已提交的数据】,导致第一个事务多次读取同一个数据不一致
幻读:事务读取了部分记录,另一个事务在这时插入记录,再后来的查询中发现了之前没有的记录
为了避免以上情况的发生,所以需要事务隔离
Spring事务隔离级别
事务隔离级别最高的是【序列化操作】ISOLATION_SERIALIZABLE 以上三个问题都可阻止;
其次是【可重复读】ISOLATION_REPEATABLE_READ,可防止脏读和不可重复读,仍存在幻读;
然后是【 读已提交】ISOLATION_READ_COMMITTED,可防止脏读,仍存在幻读和不可重复读;
级别最低的是【读未提交】ISOLATION_READ_UNCOMMITTED,可能会存在三个问题
4.事务传播行为
事务传播行为是指在一个事务方法调用另一个事务方法时,被调用的方法应该如何运行的规则
spring框架中提供了7种:
- PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
- PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
- PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
- PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则挂起该事务。
- PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则挂起该事务。
- PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
- PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则创建一个新的事务。
5.事务的管理方式
编程式事务管理和和声明式事务管理
编程式事务管理是通过编写代码来实现事务管理。在这种方式下,我们需要手动开启、提交或回滚事务。Spring提供了TransactionTemplate类来简化编程式事务管理的代码编写。
声明式事务管理是通过配置来实现事务管理。在这种方式下,我们只需要在配置文件中声明事务管理器和事务切面,Spring会自动为我们管理事务。