mysql 事务隔离级别基本概念与事务隔离级别基本操作

事务隔离级别基本概念

以下几个概念是事务隔离级别要实际解决的问题,所以需要搞清楚都是什么意思:

  1. 脏读:脏读指的是读到了其他事务未提交的数据,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并不一定最终存在数据,这就是脏读。
  2. 可重复读:可重复读指的是在一个事务内,最开始读到的数据和事务结束前的任意时刻读到的同一批数据都是一致的。通常针对数据更新( UPDATE )操作。
  3. 不可重复读:对比可重复读,不可重复读指的是在同一事务内,不同的时刻读到的同一批数据可能是不一样的,可能会受到其他事务的影响,比如其他事务改了这批数据并提交了。通常针对数据更新( UPDATE )操作。
  4. 幻读:幻读是针对数据插入( INSERT )操作来说的。假如事务A对某些行的内容做了更改,但是还未提交,此时事务B插入了与事务A更改前的记录相同记录行,并且在事务A提交之前先提交了,而这时,在事务A中查询,会发现刚刚的更改对于某些数据未起作用,但其实是事务B刚插入进来的,让用户觉得很魔幻,感觉出现了幻觉,这就叫幻读。

事务隔离级别

SQL 标准定义了四种隔离级别,MySQL 全都支持。这四种隔离级别分别是:

  1. 读取未提交( READ UNCOMMITTED )
  2. 读取已提交( READ COMMITTED )
  3. 可重复读( REPEATABLE READ )
  4. 串行化(SERIALIZABLE)

从上往下,隔离强度逐渐增强,性能逐渐变差。采用哪种隔离级别要根据系统需求权衡决定,其中,可重复读是 MySQL 的默认级别。事务隔离其实就是为了解决上面提到的 脏读、不可重复读、幻读 这几个问题,下面展示了 4 种隔离级别对这三个问题的解决程度。

隔离级别 脏读 不可重复读 幻读
读取未提交 可能 可能 可能
读取已提交 不可能 可能 可能
可重复读 不可能 不可能 可能
串行化 不可能 不可能 不可能

只有串行化的隔离级别解决了全部这 3 个问题,其他的 3 个隔离级别都有缺陷。



事务隔离级别基本操作

如何设置隔离级别

我们可以通过一下语句查看当前数据库的隔离级别,通过下面语句可以看出我使用的 MySQL 的隔离级别是 REPEATABLE-READ,也就是可重复读,这也是 MySQL 的默认级别。

show variables like "transaction_isolation";
mysql 事务隔离级别基本概念与事务隔离级别基本操作
稍后,我们要修改数据库的隔离级别,所以先了解一下具体的修改方式。

修改隔离级别的语句是:

set [作用域] transaction_isolation level [事务隔离级别];
set [session | global] transaction isolation level [READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE];

其中作用域可以是 session 或者 global ,global 是全局的,而 session 只针对当前回话窗口。隔离级别是 READ UNCOMMITTED 或者 READ COMMITTED 或者 REPEATABLE READ 或者 SERIALIZABLE 这四种,不区分大小写。

比如下面这个语句的意思是设置全局隔离级别为读取已提交级别。

修改全局隔离级别为读取已提交
set global transaction isolation level read committed;
修改当前会话隔离级别为读取已提交
set session transaction isolation level read committed;

查询全局隔离级别
show global variables like "transaction_isolation";
查询当前会话隔离级别
show session variables like "transaction_isolation";

以下是修改测试:

set global transaction isolation level read committed;
mysql 事务隔离级别基本概念与事务隔离级别基本操作

上一篇:安装visualStudio出现cantinstallMicrosoft.TeamFoundation.OfficeIntegration.Resources...


下一篇:AJAX里调用AJAX,作定时进度刷新