首页 > 数据库 > MySQL > MySQL入门--隔离级别
MySQL入门--事务隔离级别
1) 隔离级别介绍
如果一个客户机的事务更改了数据,其他客户机的事务是应发现这些更改还是应与其隔离,事务隔离级别可以确定同时进行的事务在访问相同数据时彼此交互的方式。使用存储引擎可实现隔离级别。隔离级别选项在不同的数据库服务器之间是不一样的,因此, InnoDB 所实现的级别可能与其他数据库系统所实现的级别并不完全对应。 InnoDB 可实现四种隔离级别,用于控制事务所做的更改在多大程度上可由其他同时进行的事务注意到。四种隔离级别如下:
l READ UNCOMMITTED :允许事务查看其他事务所进行的未提交更改;允许发生“脏” 读、不可重复读和虚读。
l READ COMMITTED :允许事务查看其他事务所进行的已提交更改;允许发生不可重复读和虚读。未提交的更改仍不可见。
l REPEATABLE READ :确保每个事务的 SELECT 输出一致, InnoDB 的默认级别 ;无论其他事务所做的更改是否已提交,两次都会获得相同的结果。换句话说,也就是不同的事务会对相同的数据产生一致的结果。
l SERIALIZABLE :将一个事务的结果与其他事务完全隔离;与 REPEATABLE READ 类似,但其限制性更强,即一个事务所选的行不能由其他事务更改,直到第一个事务完成为止。
2) 设置隔离级别
系统默认事务级别为: repeatable-read
方法一、 服务器启动时设置级别。
– 在 mysqld 命令中使用 --transaction-isolation 选项。
– 在配置文件中设置 transaction-isolation :
[mysqld]
transaction-isolation = <isolation_level>
在选项文件中或在命令行上将 <isolation_level> 值设置为:
l READ-UNCOMMITTED
l REPEATABLE-READ
l SERIALIZABLE
方法二、使用 SET TRANSACTION ISOLATION LEVEL 语句为正在运行的服务器设置。
– 语法示例:
SET GLOBAL TRANSACTION ISOLATION LEVEL <isolation_level>;
SET SESSION TRANSACTION ISOLATION LEVEL <isolation_level>;
<isolation_level>;
对于 SET TRANSACTION ISOLATION LEVEL 语句,将 <isolation_level> 值设置为:
l READ UNCOMMITTED
l REPEATABLE READ
l SERIALIZABLE 。
此事务级别可以全局设置,也可以按会话设置。如果没有显式指定,则事务隔离级别将按会话进行设置。例如,以下语句会将当前 mysql 会话的隔离级别设置为 READ COMITTED :
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
该语句相当于:
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
要设置所有后续 mysql 连接的默认级别,请使用 GLOBAL 关键字,而不是 SESSION :
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
注:设置的全局默认事务隔离级别适用于从设置时起所有新建立的客户机连接。现有连接不受影响。
方法三、 SET GLOBAL TX_ISOLATION
需要 SUPER 权限
Mysql>set global tx_isolation=’ READ-COMMITTED’
Mysql>select @@tx_isolation;
Mysql>show variables like ‘tx_isolation’;
transaction_isolation MySQL 5.7.20 引入,目的是替换即将弃用的 tx_isolation ( MySQL 8.0 );
(root@localhost) [information_schema]> show variables like '%isolat%';
+-----------------------+-----------------+
| Variable_name | Value |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
| tx_isolation | REPEATABLE-READ |
+-----------------------+-----------------+
transaction_isolation was added in MySQL 5.7.20 as an alias for tx_isolation, which is now deprecated and is removed in MySQL 8.0. Applications should be adjusted to use transaction_isolation in preference to tx_isolation.
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/16976507/viewspace-2132533/ ,如需转载,请注明出处,否则将追究法律责任。