## 分布式事务 笔记
---
### 一、CAP理论,分布式系统三要素:
- C 一致性(Consistency)数据都一样;
- A 可用性(Availability)服务响应时间可接受;
- P 分区容错性(Partition tolerance)一个崩了其他能用。
CAP为什么提出同时只能满足2点,比如:
- 1、满足C,所有数据都一样,则需要同步数据;
- 2、满足A,服务都是正常的且响应时间也可以接受。
- 3、满足P,肯定是多服务或者多服务器。
- a、满足C、A 所有数据一样,时间要短,那么服务器越多数据同步时间越长,所以P不满足。
- b、满足C、P 所有数据一样,服务器多,那么时间不可能短,用户读取非最新数据,所以A不满足。
- c、满足A、P 时间短、服务器多C就不可能满足。
---
### 二、ACID理论,主要是关系型数据库:
- 原子性(Atomicity) 全部成功或全部失败回滚;
- 一致性(Consistency) A与B一共有100块钱,不管怎么转账一共还是只有100;
- 隔离性(Isolation) 并发执行的事务之间不能相互影响,也就是解决事务并发的安全问题;
- 持久性 (Durable) 事务提交后就是永久的。
**事务隔离性内涵以及并发带来的问题有:**
1. 脏读(事务读取另一个事务未提交数据)
a) 两个并发事务A,B。A修改数据未提交,B读取了A未提交的数据;
b) 隔离级别设置为 Read Committed 时,就可以避免脏读,但是仍可能会造成不可重复读;
c) Sql Server、Oracle 默认级别就是 Read committed。
2. 不可重复读(一个事务多次查询返回不同值)
a) 两个并发事务A,B。A读取了数据,B修改数据后,A再读取则数据不同了;
b) 隔离级别设置为Repeatable read时,可以避免不可重复读;
c) MySQL 默认隔离级别就是 Repeatable read。
3. 幻读(事务修改数据后,另一个事务又插入数据,影响读取结果)
a) 两个并发事务A,B。A修改数据后,B插入数据,A又查询发现B插入数据没修改。;
b) 隔离级别设置为Serializable(最高的事务隔离级别)时,不仅可以避免脏读、不可重复读,还可以避免幻读。
**MySql四种隔离级别:**
隔离级别与并发性能成反比,隔离级别越高,并发性能越低
- Serializable (串行化):最高级别,可避免脏读、不可重复读、幻读的发生;
- Repeatable read (可重复读):可避免脏读、不可重复读的发生;
- Read committed (读已提交):可避免脏读的发生;
- Read uncommitted (读未提交):最低级别,任何情况都无法保证。
---
### 三、**数据库的并发控制(锁):**
乐观锁与悲观锁一种解决问题的思想。
乐观锁的理念是:
乐观锁不加锁去执行某项操作,如果发生冲突则失败并重试,直到成功为止。假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性;
悲观锁的理念是:
悲观锁也就是资源独占,其他线程挂起,直到锁释放。假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作。
##### 乐观锁:
- 乐观锁不锁任何东西,而是提交事务时检查记录是否被其他事务修改,没有则提交,有则回滚;
- 乐观锁采用的实现方式一般是记录数据版本(<font color='red'>版本号、时间戳</font>);
- 读取数据时将版本标识的值一并读出,数据每更新一次同时对版本标识进行更新