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

问题描述 投票:0回答:8

我想知道当前Mysql数据库设置了什么隔离级别。怎么才能查出来呢?我尝试在谷歌上搜索但没有找到。

mysql sql database transactions isolation-level
8个回答
36
投票

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

SELECT @@transaction_ISOLATION;

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

SELECT @@global.transaction_ISOLATION;

23
投票

MySQL/MariaDB 中可能有六种不同的事务隔离级别值 - 并且它们可能具有不同的值。他们是:

  1. 配置文件中定义的值。
  2. 用于启动 mysqld 的命令行选项中使用的值。
  3. 全局事务隔离级别。
  4. 会话事务隔离级别。
  5. 创建的下一个交易将使用的级别。
  6. 当前交易正在使用的级别。

您想知道其价值的原因将决定您需要哪一个(或多个)。

此外,请注意所获得的级别何时会发生变化 - 有时是由于您无法控制的因素。

1。配置级别

在配置文件中查找

transaction-isolation
条目。这可以在
[mysqld]
[server]
等部分找到。

从默认的 /etc/my.cnf 开始,但您可能需要根据使用的 include 语句查看其他配置文件。请注意,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 transactionisolation level 命令)。

要了解此值,您必须跟踪如何使用设置事务隔离级别(如果您使用过它)。

6。目前交易水平

没有办法查询这个。 (这是 MySQL bug #53341 的主题。)

要了解该值,您必须从会话级别(创建交易时)推断它是什么,以及您是否在创建交易之前立即设置了“下一个交易级别”。

参考文献


12
投票

我使用以下代码片段:

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
投票

你可以

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

1
投票

只是另一个查询语法:

MariaDB [email protected]:mysql> show variables like '%tx%'
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| tx_isolation  | REPEATABLE-READ |
| tx_read_only  | OFF             |
+---------------+-----------------+
2 rows in set
Time: 0.006s

0
投票

您可以显示会话隔离级别。 *我的回答解释了如何设置事务隔离级别:

SELECT @@SESSION.transaction_isolation;

或者:

SELECT @@transaction_isolation;

或者:

SHOW VARIABLES WHERE VARIABLE_NAME = 'transaction_isolation';

并且,您可以显示全局隔离级别:

SELECT @@GLOBAL.transaction_isolation;

此外,您还可以显示持久隔离级别(如果存在)

SELECT * FROM performance_schema.persisted_variables WHERE VARIABLE_NAME = 'transaction_isolation';
© www.soinside.com 2019 - 2024. All rights reserved.