Spring事务知识(@Transactional属性配置+事务的4大特性+事务的4种隔离级别+事务的7大传播行为+2类事务丢失)知识全面

这篇文章讲一下事务的基本知识以及都有哪些机制等等 也作为笔记的方式发布 后续继续更新

注解

@Transactional 是声明式事务 是放在public方法的事务注解


Transactional注解配置

  • isolation:隔离级别配置
    配置事务的隔离级别 如果不配置就根据使用的数据库去找默认的隔离级别 mysql的隔离级别是可重复读 oracle的隔离级别是读已提交
  • propagation:传播行为配置
    指定事务的传播行为 默认的为PROPAGATION_REQUIRED
  • rollbackFor:指定的异常回滚
    可以根据指定的异常回滚 也可以指定多个异常的类型
  • noRollbackFor:指定的异常不回滚
    可以根据指定的异常不回滚 也可以指定多个异常类型
  • readOnly:是否为只读
    这个为指定当前事务是否为只读 默认为false 如果开启就只可以读 不可以写
  • timeout:超时时间配置
    配置事务的超时时间 如果超过该时间事务还没有完成 就会自动回滚 默认值为-1

事务的四大特性

  • 原子性
    原子性的意思就是要么都成功 要么都失败 不能一方成功了 另一方失败了 这是错误的 比如说张三给李四转账100元 首先张三扣除100元 李四加100元 这是正常的执行流程 但是如果张三扣除成功了但是李四失败了这样是绝对不行的 想要保证事务的原子性 可以根据undolog日志和redolog日志来保证原子性。
  • 一致性
    一致性的意思就是要保证数据的一致性 张三给李四转账 张三扣100元那么李四也应该加100元 绝对不能出现数据的错误。
  • 隔离性
    隔离性就是当一个未提交的事务正在操作数据的时候 是不允许其他的事务来干预或者读取当前事务操作的数据 这就是事务的隔离性 共有四种隔离级别。
  • 持久性
    持久性就是当事务提交之后数据一定要正确 就算出现了不确定的因素导致服务挂掉了 只要事务提交 数据就一定不能有错误 这个和原子性都可以通过undolog和redolog来解决。

脏读 不可重复读 幻读的理解

脏读

脏读的意思就是A事务对数据进行了修改 数据已经写到了数据库中 而B事务正好要读取这个数据 那么这个数据就是脏数据 因为操作数据的A事务还未提交 很有可能会发生回滚 这样就会出现数据的错误

不可重读

不可重复读的意思就是A事务 查询一个数据的时候 正好B事务对这个数据进行了修改 那么A事务再次读取这条数据的时候就会出现和第一次不一样的数据 不可重读的重点是在于修改 对数据表中--的操作

幻读

幻读的意思和不可重复读类似 都是读取两次的时候数据不一致 但是幻读的重点是在于新增和删除 对数据库中--的操作 比如说 A事务去查询公司的总人数是9人 正巧B事务A事务第二次查询之前加了一个人 那么A事务在第二次查询的数量就出现了和第一次不一致的问题

事务的四种隔离级别

  • 读未提交
    当前事务可以读其他事务未提交的数据
    解决的问题?
    最低的隔离级别一般不用任何的问题都不能防止
  • 读已提价 (Oracle默认的隔离级别)
    当前事务可以读其他事务已提交的数据
    解决的问题?
    使用最多的隔离级别 可以解决脏读
  • 可重复读(MySql默认的隔离级别)
    当读取某个数据的时候会对这个数据加锁 其他的事务不能再对这个数据进行修改
    解决的问题?
    也是使用最多的隔离级别 可以解决脏读 不可重复读
  • 串行化
    这个是最高的隔离级别,他的意思是让所有的事务有序的执行
    解决的问题?
    可以解决脏读 不可重复读 幻读 因为所有的事务有序的执行 就不会出现A事务未提交B事务就可以执行的现象发生 但是相对的性能也会下降

向导图

在这里插入图片描述


2类事务的丢失

第一类丢失
第一类丢失的意思就是由于事务的回滚导致了数据的错误 比如说两个事务去同时操作一个数据 好比这个数据就是 age=10 A事务对这个数据做了改变将age字段的10改为20 并且提交了事务 而在A事务提交之前 B事务也对这个数据做了改变 这时候undolog日志文件中保存的还是A事务没改变之前数据age=10 这时候A事务提交事务 数据写到数据库age=20 如果这时候B事务出现了错误 执行回滚 这个数据就会出现错误 age又会变为10 A事务的提交就没有了意义
第二类丢失
第二类丢失属于是两个事务同时操作造成的问题 还是A事务操作数据 将age=10改为age=20 并且提交事务 而在A事务提交之前 B事务也去操作这个数据 并且B事务拿到的数据是age=10 因为A事务还没有提交事务 所以数据库中的数据还是age=10 这时候A事务提交数据写入数据库 这时候B事务拿着原数据去对数据操作然后修改 然后B事务提交数据写入数据库中 那么就出现了数据的丢失 A事务的提交没有了意义


事务的传播行为

传播行为的理解?
传播行为的意思就是 比如有两个方法在同一个线程下执行 这个时候 方法1调用了方法2的时候 方法2的事务该是一种什么行为去执行 所以传播行为的角度是站在被调用方的 由于两个都有事务 或者主方法没有事务从方法有事务 这就是事务的传播行为的理解

七大事务传播行为的特性
  • propagation_required
    这个是Spring默认的事务类型 它的方式就是如果主方法有事务就加入主方法的事务 没有事务就新建一个事务 保证自已有事务
  • propagation_supports
    如果没有事务就已无事务运行 如果主方法有事务就加入主方法的事务
  • propagation_mandatory
    如果主方法没有事务就抛异常 报错 如果有事务就加入主方法的事务
  • propagation_not_supported
    已没有事务方式运行 如果主方法有事务就挂起 不用事务
  • propagation_never
    也是一种没有事务的方式运行 如果主方法有事务就抛异常 报错
  • propagation_nested
    如果主方法没有事务 就新建一个事务 如果有事务 就嵌套到主事务中 独立的事务 独立的回滚和提交
  • propagation_required_new
    如果主方法没有事务就新建事务 如果有事务就将主事务挂起 先暂停 我自己创建事务 我只用我的事务

传播行为流程分析?
当方法A开始 事务注解会创建事务 并生成代理对象然后代理方法A 然后开始事务 接着调用方法B 方法B会判断一下当前方法的事务传播行为然后在执行事务 方法B事务提交 方法A事务提交


ps:一个开发界的小学生,一直在学习从未敢停止

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TianYuuuuuuuuuuu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值