猫猫说了算
理解是偶然,误解是常态。

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的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。
隔离级别 脏读 不可重复读 幻影读
读未提交
读已提交
可重复读
串行化

redo log(重做日志) 和 undo log(回滚日志) 和 bin log(二进制日志)的差别

  • redo:物理日志,是用来保证事务安全的
  • undo: 保存了事务发生之前一个数据版本,用于回滚和非锁定读。
  • bin-log: 存储每条变更的SQL语句,可以通过binlog 开进行数据恢复或者主从复制,三种模式 statement 模式不需要记录每一行,减少了日志量,提高了性能,但是因为记录的是指向的语句,需要记录上下文信息。row 模式记录了每一行数据修改的形式和细节,但是日志里大。mixed模式则是两种混合。
赠人玫瑰, 手有余香。🌹
打赏
特别鸣谢
感谢以下用户对本文的支持与鼓励
加载打赏用户中
发表评论
文章评论
暂无任何评论,快去发表吧~