文章目录
事务
事务:其实一个sql就是一个事务。我们要控制的事务是一个连接作为一个事务。
Connection con = DataSource.getConnection;
con.setAutoCommit(false);//关闭自动提交,将一个连接作为一个事务开启事务。否则一个sql作为一个事务
Statement statement = con.createStatement();
statement.excute("sql");
con.commit();//无异常提交
con.rollback();//存在因此常回滚
spring事务管理方式
编程式事务:代码侵入性高,代码重复性大
声明式事务注解:利用注解的方式采用aop,完成事务的控制。
本质上都是控制连接,将一个连接作为一个事务无异常提交,有异常回滚
spring事务七大传播特性
- 支持当前事务:
- TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
- TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
- TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。(mandatory:强制性)。
- 不支持当前事务:
- TransactionDefinition.PROPAGATION_REQUIRED_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
- TransactionDefinition.PROPAGETION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
- TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
- 其他
- TransactionDefinition.PROPAGATION_NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。
数据库四大隔离级别
读未提交,读已提交,可重复读(mysql),串行化
四大特征
ACID
原子性Atomicity、一致性、隔离性、持久性(Durability)
- 原子性:
事务中的所有操作,要么全部完成,要么不做任何操作,不能只做部分操作。如果在执行的过程中发生
了错误,要回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过。 - 持久性(Durability):
事务一旦完成,该事务对数据库所做的所有修改都会持久的保存到数据库中。为了保证持久性,数据库系统会将修改后的数据完全的记录到持久的存储上。
MySQL数据库InnoDb如何保证事务的原子性和持久性
Undo Log 逻辑日志
Undo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版本并发控制(简称:MVCC)。
原理
Undo Log的原理很简单,为了满足事务的原子性,在操作任何数据之前,首先将数据备份到一个地方(这个存储数据备份的地方称为Undo Log)。然后进行数据的修改。如果出现了错误或者用户执行了ROLLBACK语句,系统可以利用Undo Log中的备份将数据恢复到事务开始之前的状态。
RedoLog
为了能够将数据缓存一段时间,就能减少IO提高性能。但是这样就会丧失事务的持久性。因此引入了另外一
种机制来实现持久化,即Redo Log.,逻辑日志加物理日志
原理
和Undo Log相反,Redo Log记录的是新数据的备份。在事务提交前,只要将Redo Log持久化即可,
不需要将数据持久化。当系统崩溃时,虽然数据没有持久化,但是Redo Log已经持久化。系统可以根据
Redo Log的内容,将所有数据恢复到最新的状态。
Undo + Redo事务的简化过程
假设有A、B两个数据,值分别为1,2.
- 事务开始.
- 记录A=1到undo log.
- 修改A=3.
- 记录A=3到redo log.
- 记录B=2到undo log.
- 修改B=4.
- 记录B=4到redo log.
- 将redo log写入磁盘。
- 事务提交
Undo + Redo事务的特点
- 为了保证持久性,必须在事务提交前将Redo Log持久化。
- 数据不需要在事务提交前写入磁盘,而是缓存在内存中。
- Redo Log 保证事务的持久性。
- Undo Log 保证事务的原子性。
- 有一个隐含的特点,数据必须要晚于redo log写入持久存储。
分布式事务
由事务的知识我们知道,在单机项目中,事务的控制一般交由数据库控制,一般而言,一个连接就是一个事务。
全局事务协调管理器
但是在分布式项目中,可能对应不同的项目不同的连接,那么我们就需要一个全局事务协调管理器来帮助我们控制事务
那么全局事务协调管理器需要做:
- 协调个数据源提交、回滚、以及即时通信管理机制,告诉系统是否完成
- 数据源需要支持这种机制
- 应对应用故障恢复机制
分布式协议
- XA规范-----实现不透明
tomcat未实现,需要使用Jotm、Automikos第三方框架 - 2PC(Two-phaseCommit)两阶段提交协议----用的很多
1.准备阶段(协调器询问是否准备,数据库返回信息)
2. 提交/回滚 - 3PC三阶段提交协议
相对二阶段提交中间多了一个等待时间,超过等待时间就认为准备失败
解决方案
TCC
采用补偿机制;针对每个操作,都要注册一个与其相对应的确认和补偿操作
Try - confirm - cancel
可以参考开源方案
hmily