- 数据库隔离级别
- 概念讲解
脏读(Dirty Read) 一个事务读取到另一个事务还没提交的数据叫脏读。 例如,事务A修改了一行数据,但没有提交,事务 B读取了被事务A修改后的数据,之后事务A因为某种原因Rollback了,那么事务B读取的数据就是脏的。 幻读(Phantom Read) 事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者缺少了第一次查询中出现的数据。 例如,A和B事务并发执行,A事务查询数据,B事务插入或者删除数据,A事务再次查询发现结果集中有以前没有的数据,或者以前有的数据消失了,仿佛出现了幻觉。 幻读经常发生在insert操作。 不可重复读(NonRepeatable Read) 一个事务先后读到另一个事务提交之前的数据和已提交的更新数据。 A和B事务并发执行,A事务查询数据,然后B事务更新该数据,A再次查询该数据时,发现该数据变化了。 不可重复读经常发生在update和delete操作。
读未提交(Read Uncommitted) 读事务不阻塞其他读事务和写事务,未提交的写事务阻塞其他写事务但不阻塞读事务。 此隔离级别可以防止更新丢失,但不能防止脏读、不可重复读、幻读。 读已提交(Read Committed) 读事务允许其他读事务和写事务,未提交的写事务禁止其他读事务和写事务。 读未提交可以防止更新丢失、脏读,但不能防止不可重复读、幻读。 可重复读(Repeatable Read) 以操作同一行数据为前提,读事务禁止其他写事务但不阻塞读事务,未提交的写事务禁止其他读事务和写事务。 此隔离级别可以防止更新丢失、脏读、不可重复读,但不能防止幻读。 可串行化(Serializable) 提供严格的事务隔离,它要求事务序列化执行,事务只能一个接着一个地执行,不能并发执行。 此隔离级别可以防止更新丢失、脏读、不可重复读、幻读。 如果仅仅通过“行级锁”是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。
- 数据库事务四个基本要素ACID
原子性 (Atomicity) 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。 事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。 一致性(Consistency) 在事务开始之前和事务结束以后,数据库的完整性没有被破坏。 即事务前后,数据库的状态都满足所有的完整性约束。 隔离性(Isolation) 数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。 事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。 持久性 (Durability) 事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
-
为什么mysql选可重复读作为默认的隔离级别?
这个是有历史原因的,当然要从我们的主从复制开始讲起了!
主从复制,是基于什么复制的?
是基于binlog复制的!这里不想去搬binlog的概念了,就简单理解为binlog是一个记录数据库更改的文件吧~
binlog有几种格式?
OK,三种,分别是- statement:记录的是修改SQL语句
- row:记录的是每行实际数据的变更
- mixed:statement和row模式的混合
那Mysql在5.0这个版本以前,binlog只支持
STATEMENT
这种格式!而这种格式在读已提交(Read Commited)这个隔离级别下主从复制是有bug的,因此Mysql将可重复读(Repeatable Read)作为默认的隔离级别! - 参考自
- https://blog.csdn.net/weixin_39742568/article/details/110814945
- https://www.cnblogs.com/shoshana-kong/p/10516404.html