一、汇总
事务隔离级别 | 脏读 | 不可重复读 | 脏读 |
---|---|---|---|
读未提交 串行化(serializable) | 是 | 是 | 是 |
不可重复读(read-committed) | 否 | 是 | 是 |
可重复读(repeatable-read) | 否 | 否 | 是 |
串行化(serializable) | 否 | 否 | 否 |
- MySQL中的事务隔离级别是用来控制并发操作时数据的可见性和一致性的。MySQL支持四种事务隔离级别:
-
读未提交(Read Uncommitted):事务中的修改可以被其他事务读取,这可能导致读取到脏数据。该级别通常不建议使用。
-
读已提交(Read Committed):事务中的修改只能被已提交的事务读取,可以防止脏读,但是可能会出现不可重复读和幻读的问题。
-
可重复读(Repeatable Read):事务中的查询结果只能是事务开始时的状态,其他事务的修改不可见。可以防止脏读和不可重复读,但是可能会出现幻读的问题。
-
串行化(Serializable):事务串行执行,可以防止脏读、不可重复读和幻读,但是并发性能较差。
下面通过实例来剖析不同事务隔离级别的效果:
2、 假设有两个事务:事务A和事务B。
-
读未提交(Read Uncommitted):事务A在修改数据时,事务B可以读取到未提交的数据。这可能导致事务B读取到脏数据。
-
读已提交(Read Committed):事务A在修改数据后,事务B只能读取到已提交的数据。这样可以避免脏读,但是可能出现不可重复读的问题。例如,事务B在读取某一行数据后,事务A修改了该行数据,事务B再次读取时,得到的结果可能不同。
-
可重复读(Repeatable Read):事务A在修改数据后,事务B仍然只能读取到事务开始时的数据。这可以避免脏读和不可重复读,但是可能出现幻读的问题。例如,事务B在读取某个范围内的数据后,事务A插入了符合条件的新数据,事务B再次读取时会发现新增了一些数据。
-
串行化(Serializable):事务A和事务B串行执行,互相等待对方释放锁。这可以避免脏读、不可重复读和幻读,但是并发性能较差。
-
选择适当的事务隔离级别取决于具体的应用场景和需求,需要权衡数据的一致性和并发性能。
二、含义解析
mysql默认的事务隔离级别为repeatable-read,对数据库性能的影响:
1、事务隔离级别为读提交时,写数据只会锁住相应的行
2、事务隔离级别为可重复读时,如果检索条件有索引(包括主键索引)的时候,默认加锁方式是next-key 锁;如果检索条件没有索引,更新数据时会锁住整张表。一个间隙被事务加了锁,其他事务是不能在这个间隙插入记录的,这样可以防止幻读。
3、事务隔离级别为串行化时,读写数据都会锁住整张表
4、隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
如有不足,欢迎指出,期待与大家共同进步-------------