概述

事务隔离(英语:Transaction Isolation)定义了数据库系统中一个操作的结果在何时以何种方式对其他并发操作可见。隔离是事务ACID(原子性、一致性性、隔离性、持久性)四大属性之一。

隔离级别

概述

很多数据库管理系统定义了不同的“事务隔离等级”来控制锁的程度。在很多数据库系统中,多数的数据库事务都避免高等级的隔离等级(如可序列化)从而减少对系统的锁定开销。

隔离级别

  • 可序列化(SERIALIZABLE)

    要求在选定对象上的读锁和写锁保持直到事务结束后才能释放。

  • 可重复读 (REPEATABLE READ)

    在可重复读(REPEATABLE READS)隔离级别中,基于锁机制并发控制的DBMS需要对选定对象的读锁(read locks)和写锁(write locks)一直保持到事务结束,但不要求“范围锁”,因此可能会发生“幻影读”。

  • 提交读 (READ COMMITTED)

    在提交读(READ COMMITTED)级别中,基于锁机制并发控制的DBMS需要对选定对象的写锁一直保持到事务结束,但是读锁在SELECT操作完成后马上释放。和前一种隔离级别一样,也不要求“范围锁”。

  • 未提交读 (READ UNCOMMITTED)

    未提交读(READ UNCOMMITTED)是最低的隔离级别。允许“脏读”(dirty reads),事务可以看到其他事务“尚未提交”的修改。

读现象

  • 脏读

    当一个事务允许读取另外一个事务修改但未提交的数据时,就可能发生脏读。

  • 不可重复读

    在一次事务中,当一行数据获取两遍得到不同的结果表示发生了“不可重复读”.

  • 幻影读

    在事务执行过程中,当两个完全相同的查询语句执行得到不同的结果集。

隔离级别-查看 (MySQL - InnoDB)

查看Mysql 官方文档,关于查看隔离系统变量tx_isolation说明

MySQL Doc tx_isolation

1
2
3
4
/* 查看当前数据库 事务隔离级别 */
SELECT @@global.tx_isolation;
SELECT @@session.tx_isolation;
SELECT @@tx_isolation;

隔离级别-设置 (MySQL - InnoDB)

1
2
3
4
5
6
/* 查询当前隔离级别 */
SELECT @@GLOBAL.tx_isolation, @@tx_isolation;
/* 设置全局范围隔离级别 */
SET GLOBAL tx_isolation='REPEATABLE-READ';
/* 设置会话范围隔离级别 */
SET SESSION tx_isolation='SERIALIZABLE';

my.cnf设置

1
2
3
4
# MySQL支持4种事务隔离级别
# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE.
# 默认为 REPEATABLE-READ
transaction_isolation = REPEATABLE-READ

参考资料