Mysql innodb中事务的隔离级别讲解

一、汇总

事务隔离级别脏读不可重复读脏读
读未提交 串行化(serializable)
不可重复读(read-committed)
可重复读(repeatable-read)
串行化(serializable)
  1. 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、隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。

如有不足,欢迎指出,期待与大家共同进步-------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值