mysql的隔离性
mysql有一下四个隔离级别
- 读未提交
- 读提交
- 可重复读RR
- 串行读
Mysql的四种隔离级别
SQL标准定义了四种隔离级别,包括一些规则,用于限定事务内外的规则,哪些规则可以看到,而哪些规则又不允许看到!
1. Read Uncommitted(读取未提交内容)
在该隔离级别,所有事务都可以看到其他事务未提交的执行结果。读取未提交的数据,也被称为脏读。
2. Read Committed(读取提交内容)
大多数数据库系统(不包括mysql),都是默认这个隔离级别。它满足隔离的简单定义:一个事务只能看见已提交事务的改变。这种隔离级别也支持所谓的不可重复读。同一事务的其他实例在该实例处理期间可能有新的commit,所以同一select可能返回不同的结果。
3. Repeatable Read
这是Mysql的默认事务级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。而在理论上这会导致另一个棘手的问题:幻读(Phantom Read)。简单来说,幻读指当用户读取某一范围发数据行时,另一个事务又在该范围内插入新行,当用户再读取该范围的数据行时,会发现有新的“幻影”行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题
幻读:例如,事务A中有针对同一端范围有两次查询的操作,而事务B对这个范围又有提交的操作,而当事务A和事务B,并发运行的时候,事务A第一次查询会查询一段范围的数据,而之后,事务B给这段范围添加了一行数据,此时事务A又查询这段范围的数据,此时就多了一行,导致前后两次的查询不一致
4. Serializable(可串行化)
这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。这中隔离级别,可能会导致大量的超时现象和锁竞争