MySQL-如何找出事务的隔离级别

D55*_*555 5 mysql database transactions

我想知道为当前的Mysql数据库设置了什么隔离级别。怎么找到呢?我尝试在Google上搜索它,但没有找到它。

小智 15

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

SELECT @@transaction_ISOLATION;
Run Code Online (Sandbox Code Playgroud)

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

SELECT @@global.transaction_ISOLATION;
Run Code Online (Sandbox Code Playgroud)


Dmi*_*ich 11

MySQL 8+

SELECT @@transaction_isolation; -- session

SELECT @@global.transaction_isolation; -- global

根据 MySQL 8弃用说明

已弃用的 tx_isolation 和 tx_read_only 系统变量已被删除。请改用 transaction_isolation 和 transaction_read_only。


Tre*_*her 10

我使用以下代码段:

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


D55*_*555 5

我在谷歌上做了更多的搜索,发现如果有 MySQL 5.1+ 那么你可以通过在下面的查询中触发来找出隔离级别

SELECT * FROM information_schema.session_variables
WHERE variable_name = 'tx_isolation';
Run Code Online (Sandbox Code Playgroud)


Hoy*_*len 5

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 ...并且该级别将覆盖该会话中创建的下一个事务的会话级别和全局级别。之后的下一个事务将恢复为使用会话级别(除非再次发出另一个设置事务隔离级别命令)。

要知道此值,您必须跟踪如何使用设置的事务隔离级别(如果您完全使用过的话)。

6.当前交易水平

没有办法对此进行查询。(这是MySQL错误#53341的主题。)

要知道此值,您必须从会话级别(在创建事务时)以及在创建事务之前是否设置了“下一个事务级别”来推断它的含义。

参考文献