如何显示事务隔离级别(MySQL)

22

我想知道当前Mysql数据库设置了什么隔离级别。如何找到它?我尝试在谷歌上搜索,但没有找到它。

8个回答

36

检查会话事务级别(mysql8+)

SELECT @@transaction_ISOLATION;

检查全局事务级别(mysql8+)

SELECT @@global.transaction_ISOLATION;

@@global.transaction_ISOLATION是当前会话变量吗? - Nano
等一下,是不是反过来了?@@global.才是全局的。 - Bowi

23
在MySQL/MariaDB中可能存在六种不同的事务隔离级别,它们可以有不同的取值。这些级别包括:
  1. 在配置文件中定义的值。
  2. 用于启动mysqld命令行选项中的值。
  3. 全局事务隔离级别。
  4. 会话事务隔离级别。
  5. 将用于创建的非常下一个事务级别。
  6. 当前事务正在使用的级别。
了解其值的原因将决定您需要哪个(或多个)级别。
此外,要注意获得的级别什么时候可能会更改,有时是由您无法控制的因素造成的。 1.配置级别 在配置文件中查找transaction-isolation条目。这可以在[mysqld][server]等部分中找到。
可以从默认的/etc/my.cnf开始查找,但根据所使用的包含语句,您可能需要查看其他配置文件。请注意,mysqld可能会通过命令行选项启动并告诉它忽略配置文件或使用不同的配置文件集。 2.命令行选项级别 检查mysqld进程的启动方式。此处使用的级别将覆盖配置文件中指定的任何级别。

如果 mysqld 以不同的方式启动,这可能会发生变化。

3. 全局级别

可以通过运行 SELECT @@global.tx_isolation; 来检索此级别。

数据库启动时首先设置此级别,可以通过命令行选项或配置文件提供的级别进行设置。

可以通过运行 set GLOBAL transaction isolation level ... 来更改该级别。但请注意,以这种方式设置的任何值在数据库重新启动时都将丢失。如果其他程序运行了 set global 命令,则也可能发生更改。

4. 会话级别

可以通过运行 SELECT @@tx_isolation; 来检索此级别。

创建新会话/连接时,它被设置为当前全局级别。

可以在该会话中运行 set SESSION transaction isolation level ... 来更改其级别。

如果正在使用连接池,请注意其值可能会更改(恢复为全局级别),因为如果将连接放回池中,则可能会静默地终止和重新建立连接。

5. 下一个事务级别

无法查询此级别。

这个隔离级别是通过运行 set transaction isolation level ... 来设置的,该级别将覆盖该会话和全局级别,仅用于下一个在该会话中创建的事务。接下来的事务将恢复使用会话级别(除非再次发出另一个 set transaction isolation level 命令)。

要了解此值,您必须跟踪您如何使用set transaction isolation level (如果您使用过的话)。

6. 当前事务级别

无法查询该值。(这是MySQL bug #53341的主题。)

要了解此值,您必须从会话级别(在创建事务时)推断出它是什么,并且如果您在创建事务之前立即设置了“下一个事务级别”,则需要考虑这一点。

参考文献


13

我使用以下代码片段:

mysql> SELECT @@TX_ISOLATION;
+-----------------+
| @@TX_ISOLATION  |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set, 1 warning (0.00 sec)

11

MySQL 8+

SELECT @@transaction_isolation; -- session

SELECT @@global.transaction_isolation; -- global

根据 MySQL 8 的弃用说明

已移除弃用的 tx_isolation 和 tx_read_only 系统变量。请使用 transaction_isolation 和 transaction_read_only。


6

我在谷歌上进行了更多的搜索,并发现如果您拥有MySQL 5.1+,则可以通过执行以下查询来查找隔离级别

SELECT * FROM information_schema.session_variables
WHERE variable_name = 'tx_isolation';

1
请注意,此答案已过时。请参阅其他答案以获取MySQL 8的信息。 - BenMorel

1

只是另一个查询语法问题:

MariaDB root@127.0.0.1:mysql> show variables like '%tx%'
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| tx_isolation  | REPEATABLE-READ |
| tx_read_only  | OFF             |
+---------------+-----------------+
2 rows in set
Time: 0.006s

1

你可以

SELECT DATABASE();      to verify you are using the database, then
SELECT @TX_ISOLATION;    for the DB TX isolation value
SELECT @@TX_ISOLATION;   for global TX isolation value

如果您的数据库验证结果与您预期的不符,
USE [db-you-want-to-check];
SELECT DATABASE();    to verify current database, then
SELECT @TX_ISOLATION;   for current database TX isolation value
SELECT @@TX_ISOLATION;   for GLOBAL TX isolation value

0

这显示了全局隔离级别

SELECT @@GLOBAL.transaction_isolation;

这显示了会话隔离级别

SELECT @@SESSION.transaction_isolation;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接