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 | 事务管理器 |
---|---|---|---|
本地事务 | 单数据库 | 单会话 | 本地事务管理器 |
分布式事务 | 多数据源 | 多个会话 | 全局事务管理器 |
下图是一个 全局事务管理器的例子:
1.5. 参考文档
http://www.tianshouzhi.com/api/tutorials/distributed_transaction