数据库ACID

事务的四个特性(ACID)

要么都成功,要么都失败

  1. 原子性:指事务包含内的所有操作,要么都成功,要么都失败回滚
  2. 一致性:一个事务操作前后的数据完整性要保持一致(最终一致性)

拿转账举例:假设A有500块,B有500块,无论AB怎么转,事务结束后,两个人的钱必须是1000

  1. 隔离性:多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其它事务的操作所干扰,之间要相互隔离

    例如:对于任意并发事务T1和T2,在T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始

  2. 持久性:事务结束后的数据不随这外界原因导致数据丢失

    • (服务器宕机或断电)
    • 事务没有提交,恢复到原状
    • 事务已经提交持久化到数据库
    • 事务一旦提交不可逆

事务的隔离性解决了什么问题?

  1. 脏读:指一个事务读取到另一个事务未提交的数据

会话B开启一个事务,把id=1的name为武汉市修改成温州市,此时另外一个会话A也开启一个事务,读取id=1的name,此时的查询结果为温州市,会话B的事务最后回滚了刚才修改的记录,这样会话A读到的数据是不存在的,这个现象就是脏读

从根上理解MySQL事务的隔离级别

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

一个事务只能读到另一个已经提交的事务修改过的数据,并且其他事务每对该数据进行一次修改并提交后,该事务都能查询得到最新值

从根上理解 MySQL 事务的隔离级别

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

  1. 丢失更新:两个不同的事务在某一时刻对统一数据进行读取后,先后进行修改,导致第一次操作数据丢失

事务A读了一个数据为200,事务B再读取,事务A修改为100,事务B修改为400,此时事务A提交,B后提交,那么A修改的数据会被B覆盖

幻读和不可重复读的区别:

  • 不可重复读的重点是修改
  • 幻读的重点是新增和删除

从总的结果来看,似乎两者都表现为两次读取的结果不一致

但从控制角度来看,两者区别很大:

  • 避免不可重复读,只需要锁住满足条件的记录(锁行)
  • 避免幻读,只需要锁住满足条件及其相近的记录(锁表)

四种事务隔离级别?

  • 读未提交
  • 读已提交
  • 可重复读
  • 序列化/串行化

彻底搞懂 MySQL 事务的隔离级别

隔离强度逐渐增强,性能逐渐变差,采用哪种隔离级别要根据系统需求权衡决定,隔离级别可以自己设置,可重复读是MySQL的默认级别

通过网上总结提炼作为自身复习知识点用,如有侵权,请联系本人删除

posted @ 2021-06-07 17:09  Huhuhuhhu  阅读(100)  评论(0)    收藏  举报