数据库ACID
事务的四个特性(ACID)
要么都成功,要么都失败
- 原子性:指事务包含内的所有操作,要么都成功,要么都失败回滚
- 一致性:一个事务操作前后的数据完整性要保持一致(最终一致性)
拿转账举例:假设A有500块,B有500块,无论AB怎么转,事务结束后,两个人的钱必须是1000
-
隔离性:多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其它事务的操作所干扰,之间要相互隔离
例如:对于任意并发事务T1和T2,在T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始
-
持久性:事务结束后的数据不随这外界原因导致数据丢失
- (服务器宕机或断电)
- 事务没有提交,恢复到原状
- 事务已经提交持久化到数据库
- 事务一旦提交不可逆
事务的隔离性解决了什么问题?
- 脏读:指一个事务读取到另一个事务未提交的数据
会话B开启一个事务,把id=1的name为武汉市修改成温州市,此时另外一个会话A也开启一个事务,读取id=1的name,此时的查询结果为温州市,会话B的事务最后回滚了刚才修改的记录,这样会话A读到的数据是不存在的,这个现象就是脏读

- 不可重复读:一个事务内读取表中的某一行数据,多次读取结果不同
一个事务只能读到另一个已经提交的事务修改过的数据,并且其他事务每对该数据进行一次修改并提交后,该事务都能查询得到最新值

- 虚读/幻读:一个事务内读取到别的事务插入的数据,导致前后读取数据总量不一致(一般是行影响)

- 丢失更新:两个不同的事务在某一时刻对统一数据进行读取后,先后进行修改,导致第一次操作数据丢失
事务A读了一个数据为200,事务B再读取,事务A修改为100,事务B修改为400,此时事务A提交,B后提交,那么A修改的数据会被B覆盖

幻读和不可重复读的区别:
- 不可重复读的重点是修改
- 幻读的重点是新增和删除
从总的结果来看,似乎两者都表现为两次读取的结果不一致
但从控制角度来看,两者区别很大:
- 避免不可重复读,只需要锁住满足条件的记录(锁行)
- 避免幻读,只需要锁住满足条件及其相近的记录(锁表)
四种事务隔离级别?
- 读未提交
- 读已提交
- 可重复读
- 序列化/串行化

隔离强度逐渐增强,性能逐渐变差,采用哪种隔离级别要根据系统需求权衡决定,隔离级别可以自己设置,可重复读是MySQL的默认级别
通过网上总结提炼作为自身复习知识点用,如有侵权,请联系本人删除

浙公网安备 33010602011771号