远浅
理解他人,内省自己。

MySQL 常见知识点

远浅发表于: 2020-10-13 15:31分类: 技术

什么是事务?

简单来说,就是一组操作,要么全部成功,要么全部失败。

常见的例子就是转账的案例。转账小张转账给小明,小张的余额减少1000元,小明的余额增加1000元。必须保证这两个操作都成功,一次转账才算完成。

事务的特性 - ACID

  • 原子性:事务是最小的执行单位,不可继续拆分。要么全部完成,要么就不起作用。
  • 一致性:执行事务中,所有数据应该要与预期的结果保持一致。
  • 隔离性:并发访问数据库时,事务之间相互独立。
  • 持久性:事务提交之后,对数据的改变是永久的,数据库故障也不会有影响。

脏读 vs 幻读 vs 不可重复读。

  • 脏读:一个事物 T1 正在访问数据并且修改,但是没提交到数据库,却被另外一个T2事务使用,并且依据 T1 未提交的数据进行了业务。这个操作是不准确的。
  • 幻读:在 T1 事务期间读取数据,T2 事务插入了几行数据,T1 就会发现多了几行数据。
  • 不可重复读:一个事务 T1 多次读取同一个数据,T2 事务的修改导致 T1 读取的数据是不一致的。

事务的隔离级别

InnoDB 的默认隔离级别是RR。

  • READ-UNCOMMITTED(读取未提交):最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读。
  • READ-COMMITTED(读取已提交):允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生。
  • REPEATABLE-READ(可重复读): 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
  • SERIALIZABLE(可串行化): 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
隔离级别 脏读 不可重复读 幻影读
读未提交
读已提交
可重复读
串行化
赠人玫瑰, 手有余香。🌹
打赏
特别鸣谢
感谢以下用户对本文的支持与鼓励
加载打赏用户中
发表评论
评论列表
评论努力加载中