Spring事务学习

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种:

  1. PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
  2. PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
  3. PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
  4. PROPAGATION_REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则挂起该事务。
  5. PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则挂起该事务。
  6. PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
  7. PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则创建一个新的事务。

5.事务的管理方式

编程式事务管理和和声明式事务管理

编程式事务管理是通过编写代码来实现事务管理。在这种方式下,我们需要手动开启、提交或回滚事务。Spring提供了TransactionTemplate类来简化编程式事务管理的代码编写。

声明式事务管理是通过配置来实现事务管理。在这种方式下,我们只需要在配置文件中声明事务管理器和事务切面,Spring会自动为我们管理事务。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值