第28集 事务基础概念
【视频来源于:B站up主孙帅suns Spring源码视频】【微信号:suns45】
1、什么是事务
保证业务操作完整性的一种数据库机制 (driver 驱动)
2、事务特点 ACID
A 原子性 (多次操作 要不一起成功 要不一起失败 (部分失败 savepoint))
C 一致性 (事务开始时数据状态,事务结束是数据状态 一致 )
I 隔离性 (多个事务不能互相影响,做到隔离)
D 持久性 (事务操作的结果 ,永久持久化在数据库)
3、事务处理
3.1、单机版事务
- JDBC,Hiberate,Mybatis底层都是Connection
- Hibernate(JPA) 事务封装唉了Transaction (Connection)
MyBatis事务封装了SqlSession (Connection) - 单机版事务是连接独立完成的
- connection.setAutoCommit(false)
- connection.commit()
- connection.rollback()
3.2、分布式事务(Spring支持)
4、Service和Dao的connection如何保证Service DAO共用同一个Connection?
通过ThreadLocal,使用Spring也是把Connection绑定到了ThreadLocal。
2、Spring分布式事务是什么呢?
应用容器相关的 比如说 Jboss Weblogic Websphere,
3、声明式事务的几大要素是什么?
-
1、原始对象
-
2、额外功能
- 控制事务的代码靠PlatformTransactionManager【接口】控制事务,实现类有:
DataSourceTransactionManager (JDBC,Mybatis),HibernateTransctionManager(Hibernate JPA) - 事务属性
- 控制事务的代码靠PlatformTransactionManager【接口】控制事务,实现类有:
-
3、切面
- 图片:
- 切面 等于 aop:pointcut:切入点 + aop:advisor:额外功能
4、控制事务靠的是什么?
PlatformTransactionManager接口
5、为什么PlatformTransactionManager是接口呢?
因为事务分为单机版事务和分布式事务,为了隔离他们的区别,所以设计成了接口,都有对应的实现类。
6、PlatformTransactionManager底层干了什么事情?
开启事务,事务提交,事务回滚
7、PlatformTransactionManager需要连接吗?
需要,需要Connecttion还需要DateSourceTransactinoManager
8、事务属性有哪些?
事务属性是最难的,但是看似在编程当中是最没有用的。
- 隔离属性 isolation
- 定义了在进行并发访问时不同事务之间的隔离程度。常见的隔离级别有 READ_UNCOMMITTED 、READ_COMMITTED 、REPEATABLE_READ 和 SERIALIZABLE 等。
- 传播属性 propagation
- 定义了当前事务方法被其他事务方法调用时,当前事务如何进行管理控制,常见传播行为有 REQUIRED 、SUPPORTS 、MANDATORY 、REQUIRES_NEW 、NOT_SUPPORTED 和 NEVER 等。
- 只读属性 readOnly
- 只读事务标识开启后,表示当前事务仅能进行读操作,不能执行修改操作,从而提高并发性能。
- 超时属性 timeout
- 规定了事务的最长执行时间,即在规定时间内必须完成事务,否则事务会被自动终止回滚。
- 异常属性 exception
- 异常属性定义了触发事务回滚的异常类型列表。如果出现与事务属性中定义的异常类型相匹配的异常,则事务会回滚到先前的状态,以确保数据的完整性和一致性。
9、xml搭建环境
10、注解搭建环境
第28集:学习目标总结
1、什么是事务?
保证业务操作完整性的一种数据库机制
保证二个操作要么一起成功,要么一起失败。
2、事务的特点是什么呢?
ACID
A:代表原子性,比如说两个操作要么都成功要么都失败
C:代表一致性,比如说转账前后我都是200块,不管怎么操作都是200块。
I:代表隔离性,多个事务之前不能互相影响,做到隔离。
D:代表持久化,事务操作的结果,要永久保存到数据库中。
3、Spring的事务的种类
- 1、单机版事务和分布式事务。
- 单机版事务:就是我们正常使用的那些,底层靠的是Connection,设置auto,commit,rollback
- 分布式事务:指的是应用服务器而不是Web服务器,比如Jboss Weblogic Websphere
- 2、分为声明式事务和编程式事务
4、声明式事务的几大要素是什么?
- 切入点:是否加了Transtional注解
- 额外功能:执行方法,有无异常,没有异常就提交,有异常就回滚。【额外功能+在前执行还是在后执行】
- 事务属性:
- 隔离属性
- 读未提交
- 读已提交
- 可重复
- 串行化
- 传播属性
REQUIRES_NEW
- 外部没有事务,则开启事务,如果外部存在事务则挂起原事务,执行新事物,新事物执行完了,还原旧事务
REQUIRED
- 当前的这个业务方法 外部没有事务 开启事务 外部存在事务 则融合,这种情况下,所有操作都绑定到同一事务上,如果其中任何一个操作失败,整个事务都将回滚。
NOT_SUPPORTED
- 不为这个方法开启事务
NEVER
- 必须在一个没有的事务中执行,否则抛出异常
MANDATORY
- 必须在一个已有的事务中执行,否则抛出异常
NESTED
- 如果当前没有事务 和REQUIRED效果一样,创建一个新的事务并将方法加入该事务。如果已经存在一个事务中,则创建一个嵌套事务,并在嵌套事务中执行所有操作。嵌套事务有自己的保存点,并且可以独立于外部事务进行提交或回滚。如果嵌套事务失败,会回滚嵌套事务并抛出异常,但不会影响到外部事务。只有当所有事务都完成或成功提交后,才将更改保存到数据库。
- 与
Propagation.REQUIRED
不同,Propagation.NESTED
可以实现“点对点事务”,即在应用程序中拆分长事务,使其可以在较小的单元操作上运行。这样可以避免长时间锁定数据库资源,提高并发性能和可伸缩性。 - 总之,
Propagation.NESTED
可以为 Spring 应用程序提供更加灵活的事务管理方式,但需要注意它的使用场景和规则,避免出现不必要的问题。
- 超时属性
- 到达这个时间没有执行完成就会回滚
- 异常属性
- 配置异常
- 隔离属性
5、Spring事务NESTED
和REQUIRED
的区别
- NESTED允许内部事务拥有自己的事务提交或回滚,可以进行粒度更细的控制;REQUIRED所有操作都将绑定到同一事务中。
- 如果内部事务因为某些原因失败(例如违反唯一性约束),它会回滚并抛出异常,但外部事务仍然会继续进行。因此,NESTED的回滚影响只局限于它自己的操作,而REQUIRED可能会造成整个事务的回滚。
6、控制事务靠的是什么?底层干了什么事情?
- 1、靠的是PlatformTransactionManager这个接口,由于区分了单机版事务和分布式事务,根据实现类进行具体实现
- 2、底层干的其实还是开启事务,事务提交,事务回滚。
7、一般怎么应用呢?
现在的话xml用的比较少了,但是如果说你想全局控制@Transtional,而不是一个一个的去打注解 去标记,可以用xml。一般情况下都是使用@Transactional
8、spring传播属性解决的是什么问题?
嵌套事务问题
9、嵌套事务问题的核心是什么呢?
只保证在一个时刻,有一个事务或者其他 事务 挂起关闭。和锁的概念有点像
10、而嵌套事务出现的原因是什么呢?
service调用service
11、分布式事务的调用方案解决的核心是什么?
需要有人通知我有没有成功,有个全局监管者。
12、分布式事务如果不用框架,不用MQ你怎么解决?
记录好结果进行反向调用解决,而反向调用如果失败了怎么办?需要补偿机制。