在MySQL的众多存储引擎中,只有InnoDB支持事务,所有这里说的事务隔离级别指的是InnoDB下的事务隔离级别。

四种隔离级别

隔离级别脏读不可重复读幻读
读未提交 READ-UNCOMMITTED可能可能可能
读已提交 READ-COMMITTED不可能可能可能
可重复读 REPEATABLE-READ不可能不可能可能
串行化 SERIALIZABLE不可能不可能不可能

查看

select @@tx_isolation; # 5.0以上版本
select @@transaction_isolation; # 8.0以上版本
show variables like '%_isolation%';

另外,还可以使用下列语句分别查询全局和会话的事务隔离级别

SELECT @@global.tx_isolation;
SELECT @@session.tx_isolation;

提示:在MySQL 8.0.3 中,tx_isolation 变量被 transaction_isolation 变量替换了。在 MySQL 8.0.3 版本中查询事务隔离级别,只要把上述查询语句中的 tx_isolation 变量替换成 transaction_isolation 变量即可。

修改

  • MySQL 默认的隔离级别是可重复读( REPEATABLE-READ)
  • 在 my.inf 文件中修改隔离级别

可以用 SET TRANSACTION 语句改变单个会话或者所有新进连接的隔离级别。

语法如下:

SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}
set session transaction isolation level read committed;
set global transaction isolation level read committed;

执行事务语句

begin;
select * from table where id = 1;
commit;