Spring中事务的详解

1.什么是事务?

事务是逻辑上的一组操作,要么都执行,要么都不执行.

2.事务的特性(ACID)

在这里插入图片描述

原子性:原子最小单位,不能分割,不能单独运行,要么成功要么失败。
一致性:例如能量守恒。
隔离性:多个并发访问时,一个事物的执行不能受其他事务的干扰。隔离级别解决问题。
持久性:事务一旦提交,它对数据库的修改是永久的。

3.事务没有隔离级别的问题

在这里插入图片描述
在这里插入图片描述

脏读:事务a读取了事务b未提交(commit)的数据,然后把他进行修改的操作,如果这时候事务b恰巧进行了回滚的操作,那么事务a读取到的就是脏数据,也就是所谓脏读。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

不可重复读:是指事务a读取到了事务b已提交的数据,两次查询的结果不一致。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

幻读:事务a读取到事务b提交的新增数据,幻读一般发生在统计数据中。
在这里插入图片描述

4.数据库事务隔离级别

常见的事务隔离级别有四种,从低到高依次是:

读未提交(Read uncommitted)
读已提交(Read committed)
可重复读(Repeatable read)
串行化(Serializable)

在这里插入图片描述

事务的隔离级别越低,可能出现的并发异常越多,但通常而言系统能提供的并发能力就越强。

读未提交(Read uncommitted),B事务可以读取到未提交的A事务中操作的数据,会导致脏读,为解决脏读,引入读已提交。

读已提交(Read committed),B事务要等A事务提交后才能读取到A事务中操作的数据,但是依然会导致不可重复读的问题(即B事务在A事务提交前后读取的数据不一致)。

可重复读(Repeatable read),一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的,Mysql是通过快照版本来实现可重复读的,即事务开始时就拿到了一个版本号,别的事务操作的数据版本号不一样,就不会影响当前事务重复读取的数据,但是会看不到别的事务提交的数据。但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作。

序列化(Serializable),最高的事务隔离级别,事务串行化顺序执行,但是效率低下,比较耗数据库性能,一般不使用。
在这里插入图片描述

5.Spring事务两种实现方式

在这里插入图片描述

6.那么什么是事务属性呢?

在这里插入图片描述

spring事务领头人叫Juergen Hoeller,于尔根·糊了…先混个脸熟哈,他写了几乎全部的spring事务代码。读源码先拜神,掌握他的源码的风格,读起来会通畅很多。

6.1.事务的定义

事务(Transaction)是数据库区别于文件系统的重要特性之一。目前国际认可的数据库设计原则是ACID特性,用以保证数据库事务的正确执行。Mysql的innodb引擎中的事务就完全符合ACID特性。

spring对于事务的支持,分层概览图如下:
在这里插入图片描述

6.2.事务的特性

在这里插入图片描述
要保证事务的ACID特性,spring给事务定义了6个属性,对应于声明式事务注解(org.springframework.transaction.annotation.Transactional)@Transactional(key1=,key2=…)

隔离级别: 为了解决数据库容易出现的问题,分级加锁处理策略。 对应注解中的属性isolation
超时时间: 定义一个事务执行过程多久算超时,以便超时后回滚。可以防止长期运行的事务占用资源.对应注解中的属性timeout
是否只读:表示这个事务只读取数据但不更新数据, 这样可以帮助数据库引擎优化事务.对应注解中的属性readOnly
传播机制: 对事务的传播特性进行定义,共有7种类型。对应注解中的属性propagation
回滚机制:定义遇到异常时回滚策略。对应注解中的属性rollbackFor、noRollbackFor、rollbackForClassName、noRollbackForClassName

在这里插入图片描述

6.3.七个传播特性

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

釣餌锒鐺

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

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

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

打赏作者

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

抵扣说明:

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

余额充值