事务特点以及分布式事务

事务

事务:其实一个sql就是一个事务。我们要控制的事务是一个连接作为一个事务。

Connection con = DataSource.getConnection;
con.setAutoCommit(false);//关闭自动提交,将一个连接作为一个事务开启事务。否则一个sql作为一个事务
Statement statement = con.createStatement();
statement.excute("sql");
con.commit();//无异常提交
con.rollback();//存在因此常回滚

spring事务管理方式

编程式事务:代码侵入性高,代码重复性大
声明式事务注解:利用注解的方式采用aop,完成事务的控制。
本质上都是控制连接,将一个连接作为一个事务无异常提交,有异常回滚

spring事务七大传播特性

  1. 支持当前事务:
  • TransactionDefinition.PROPAGATION_REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
  • TransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
  • TransactionDefinition.PROPAGATION_MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。(mandatory:强制性)。
  1. 不支持当前事务:
  • TransactionDefinition.PROPAGATION_REQUIRED_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起。
  • TransactionDefinition.PROPAGETION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。
  • TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。
  1. 其他
  • 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.

  1. 事务开始.
  2. 记录A=1到undo log.
  3. 修改A=3.
  4. 记录A=3到redo log.
  5. 记录B=2到undo log.
  6. 修改B=4.
  7. 记录B=4到redo log.
  8. 将redo log写入磁盘。
  9. 事务提交

Undo + Redo事务的特点

  1. 为了保证持久性,必须在事务提交前将Redo Log持久化。
  2. 数据不需要在事务提交前写入磁盘,而是缓存在内存中。
  3. Redo Log 保证事务的持久性。
  4. Undo Log 保证事务的原子性。
  5. 有一个隐含的特点,数据必须要晚于redo log写入持久存储。

分布式事务

由事务的知识我们知道,在单机项目中,事务的控制一般交由数据库控制,一般而言,一个连接就是一个事务。

全局事务协调管理器

但是在分布式项目中,可能对应不同的项目不同的连接,那么我们就需要一个全局事务协调管理器来帮助我们控制事务

那么全局事务协调管理器需要做:

  • 协调个数据源提交、回滚、以及即时通信管理机制,告诉系统是否完成
  • 数据源需要支持这种机制
  • 应对应用故障恢复机制

分布式协议

  • XA规范-----实现不透明
    tomcat未实现,需要使用Jotm、Automikos第三方框架
  • 2PC(Two-phaseCommit)两阶段提交协议----用的很多
    1.准备阶段(协调器询问是否准备,数据库返回信息)
    2. 提交/回滚
  • 3PC三阶段提交协议
    相对二阶段提交中间多了一个等待时间,超过等待时间就认为准备失败

解决方案

TCC

采用补偿机制;针对每个操作,都要注册一个与其相对应的确认和补偿操作
Try - confirm - cancel
在这里插入图片描述
可以参考开源方案
hmily

MQ事务

本地事务表

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值