MySQL 的隔离级别 自理解
说起事务,你肯定不会陌生。ACID你也肯定听过,今天来记录下我所理解的ACID中的“I”,即 隔离性。
首先,标准的SQL隔离级别有以下几种:
1.可重复读(repeatable read)。
2.读未提交(read uncommitted)。
3.读已提交(read committed)。
4.串行化(serializable )。
依次来解释下:
1.可重复读表示的是,在事务中任意一个阶段,看到的值都是和事务启动时的值一致。未提交变更,对其他事务不可见。
2.读未提交指的是,未提交事务前的所有修改都对其他事务可见。
3.读已提交指的是,已提交的事务后,其值才能被其他事务看见。
4.串行化指的是在读取和更新时,都对这行数据进行加读/写锁,其他事务无法访问,必须等加锁的事务执行完了才能访问。
而在实际的实现过程中,数据库使用了视图来进行操作的。例如,
【可重复读】数据库会在事务开始时就创建一个视图,此后事务中的所有操作都基于这个视图。
【读提交】是在每个sql开始执行时创建的视图。
【读未提交】则是直接返回最新值,因为它任何时候都能被其他事务看见。
【串行化】是用了加锁来避免同时进行操作数据。
我们可以使用
show VARIABLES LIKE 'transaction_isolation';
来查看当前数据库使用的是哪种隔离级别。
例如博主这个就是【可重复读】(REPEATABLE-READ)。
继续深入一点了解,其实之所以可以有隔离级别,是因为Mysql的多版本并发控制(MVCC)。
在 MySQL 中,实际上每条记录在更新的时候都会同时记录一条回滚操作。记录上的最新值,通过回滚操作,都可以得到前一个状态的值。
实际开发中,尽量不要使用长事务,因为这会导致非常庞大的回滚记录日志。建议都用显示事务提交 begin commit,将自动提交 set autocommit设置为 1。
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: