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';

来查看当前数据库使用的是哪种隔离级别。

Python

例如博主这个就是【可重复读】(REPEATABLE-READ)。

继续深入一点了解,其实之所以可以有隔离级别,是因为Mysql的多版本并发控制(MVCC)。

在 MySQL 中,实际上每条记录在更新的时候都会同时记录一条回滚操作。记录上的最新值,通过回滚操作,都可以得到前一个状态的值。

实际开发中,尽量不要使用长事务,因为这会导致非常庞大的回滚记录日志。建议都用显示事务提交 begin commit,将自动提交 set autocommit设置为 1。

本作品采用《CC 协议》,转载必须注明作者和本文链接
纯阳太极两仪四象八卦圈
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!