1.1. 一、事务的ACID特性:

  • 原子性(Atomicity):事务包含的操作,要么全部成功,要么全部失败。
  • 一致性(Consistency):事务前后数据的完整性必须保持一致。如:A向B转账200,转账后A减200,B加200,转账前后A+B的余额一致。一致性表示事务完成后,符合逻辑运算。
  • 隔离型(Isolation):并行的两个事务,相互之间是不干扰的,互相隔离的。
  • 持久性(Durability):持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的。接下来即使数据库发生故障也不应该对其有任何影响。

1.2. 二、事务的隔离:

2个事务根据隔离级别不同,会产生下面3个相互影响。

  • 脏读:事务a读取了事务b未提交的数据。

    比如:p转200元给m,p账户减掉了200,但是整个事务a没有提交。这时候另外一个事务b查询p的余额,就查询到了未提交的数据。

  • 不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。

    比如:在事务a中,第1次查询p账户的余额是100,然后事务b修改了p账户的余额为50,事务a再查询p账户的余额是50。2次查询的结果不一样,就是不可重复读。

  • 幻读:是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致(一般是行影响,多了一行)。

脏读和幻读的区别

  • 脏读:一个事务更新,另一个事务在读取。
  • 幻读:一个事务插入或删除,另一个事务读取。

1.3. 三、事务的隔离级别

事务的4个隔离级别,以及2个事务之间的相互影响,可以用下面的表格表示:

名字 隔离级别 脏读 不可重复读 幻读 数据库默认隔离级别
读未提交 Read uncommitted
读已提交 Read committed Oracle和SQL Server
可重复读 Repeatable read Mysql
串行化 Serializable
  • 脏读、不可重复读: 指的是同一条数据。幻读:指多条数据。
  • 隔离级别越高,性能越低。

1.4. 四、分布式事务

  • 本地事务:单个数据源(单库)本地控制的。

    比如:spring程序开启事务,提交事务,中间生成很多sql,这些sql提交给数据库执行。这时候保证事务的是数据库自带的本地事务管理器。

  • 分布式事务:多个数据源参与的事务。

    多个数据源的操作,作为一个事务执行。这时候需要一个外部的、独立于单个数据源的全局事物管理器。管理多个数据源的事物提交和回滚。

事务 数据库 会话session 事务管理器
本地事务 单数据库 单会话 本地事务管理器
分布式事务 多数据源 多个会话 全局事务管理器

下图是一个 全局事务管理器的例子:

image-20200311104903788

1.5. 参考文档

http://www.tianshouzhi.com/api/tutorials/distributed_transaction

results matching ""

    No results matching ""