【Spring源码分析】10、Spring 事物 案例学习、原理分析、源码分析

你的名字 2022-12-05 12:08 307阅读 0赞

文章目录

  • 1、Spring 事物管理
      • (1)四种事物特性ACID
      • (2)五种隔离级别
      • (3)七种传播行为
  • 2、Spring 事物功能测试
  • 3、Spring 事物原理
  • 4、更多细节学习
  • 微信公众号

1、Spring 事物管理

(1)四种事物特性ACID

事务达到的目的就是要么一起成功,要么一起失败


























特性 描述
原子性(atomicity) 强调事务的不可分割
一致性(consistency) 事物结束后系统状态是一致的
隔离性(isolation) 一个事务的执行的过程中,不应该受到其他事务的干扰
持久性(durability) 事务一旦结束,数据就持久到数据库

在一个应用中,多个事物同时运行,经常会操作同一个数据,数据库的隔离性和并发控制有很大的关系,并发虽然是需要的,但是会导致以下问题:






















问题 描述
脏读(Dirty read) 脏读发生在一个事物读取了被另一个事物改写,但是尚未提交的数据时,如果这些改变之后被回滚了,那么第一个事物读取到的数据就是无效的
不可重复读(Nonrepeatable read) 不可重复读发生在一个事物执行相同的查询两次或两次以上,但每次查询结果都不相同时,通常由另一个并发事物在两次查询之间更新了数据(重点在于修改)
幻读(Phantom reads) 幻读发生在一个事物读取几行记录后,另一个并发事物插入了一些记录,幻读就发生了,在后来的查询中,第一个事物就会发现一些原来没有的额外记录(重点在新增、删除)

在理想状态下,事务之间将完全隔离,从而可以防止这些问题发生。然而,完全隔离会影响性能,因为隔离经常涉及到锁定在数据库中的记录(甚至有时是锁表)。完全隔离要求事务相互等待来完成工作,会阻碍并发。因此,可以根据业务场景选择不同的隔离级别

事务设置隔离级别,就是为了解决上述产生的问题的,下面就说一下事物五种隔离级别

(2)五种隔离级别




































隔离级别 默认使用 描述
READ_UNCOMMITTED (未提交读) 是最低读事务隔离级别,它允许另外一个事务可以看到这个事务未提交读数据
READ_COMMITTED (提交后读) oracle默认级别 保证一个事务提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据
REPEATABLE_READ(可重复读) mysql默认级别 这种事务隔离级别可以防止脏读,不可重复读。但是可能会出现幻想读。它除了保证一个事务不能被另外一个事务读取未提交读数据之外还避免了一下情况产生(不可重复读)
SERIALIZABLE 这是花费最高代价但最可靠但事务隔离级别。事务被处理为顺序执行。除了防止脏读,不可重复读之外,还避免了幻象读(避免三种)
DEFAULT 数据库默认的隔离级别

五种隔离级别潜在问题:可能出现√、不会出现×




































隔离级别 脏读(Dirty read) 不可重复读(Nonrepeatable read) 幻读(Phantom reads)
READ_UNCOMMITTED (未提交读)
READ_COMMITTED (提交后读) ×
REPEATABLE_READ(可重复读) × ×
SERIALIZABLE × × ×

(3)七种传播行为

Spring在TransactionDefinition接口中规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播






































传播行为 说明
PROPAGATION_REQUIRED 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择
PROPAGATION_SUPPORTS 支持当前事务,如果当前没有事务,就以非事务方式执行
PROPAGATION_MANDATORY 使用当前的事务,如果当前没有事务,就抛出异常
PROPAGATION_REQUIRES_NEW 新建事务,如果当前存在事务,把当前事务挂起
PROPAGATION_NOT_SUPPORTED 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
PROPAGATION_NEVER 以非事务方式执行,如果当前存在事务,则抛出异常
PROPAGATION_NESTED 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作

前三种支持当前事物,后三种不支持当前事物,最后一种为嵌套事物

2、Spring 事物功能测试

由于本地环境出问题了,所以暂时写不了 …

3、Spring 事物原理

4、更多细节学习

  • Tellsea全系列文章目录

微信公众号

每天Get一个小技巧

发表评论

表情:
评论列表 (有 0 条评论,307人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Spring分析

    前言 作为一名开发人员,阅读源码是一个很好的学习方式。本文将结合《Spring源码深度解析》来分析Spring 5.0.6版本的源代码,若有描述错误之处,欢迎指正。 ...