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

qfe3c7zg  于 2023-04-19  发布在  Mysql
关注(0)|答案(8)|浏览(177)

我想知道当前Mysql数据库设置的隔离级别是多少。如何找到它?我试图在谷歌上搜索它,但没有找到它。

dluptydi

dluptydi1#

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

SELECT @@transaction_ISOLATION;

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

SELECT @@global.transaction_ISOLATION;
vfwfrxfs

vfwfrxfs2#

MySQL/MariaDB中可能有六个不同的事务隔离级别值-它们可以有不同的值。它们是:
1.配置文件中定义的值。
1.用于启动 mysqld 的命令行选项中使用的值。
1.全局事务隔离级别。
1.会话事务隔离级别。
1.创建的下一个事务将使用的级别。
1.当前事务处理正在使用的级别。
你想知道它的值的原因,将决定你需要哪一个(或多个)。
此外,要注意什么时候获得的水平可以改变-有时是由你无法控制的事情。

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 transaction isolation level 命令)。
要知道这个值,您必须跟踪您是如何使用 set transaction isolation level 的(如果您使用过它的话)。

6.当前交易级别

没有办法查询这个。(它是MySQL bug #53341的主题。)
要知道这个值,您必须从会话级别(在创建事务时)推断它是什么,以及您是否在创建事务之前立即设置了“下一个事务级别”。

参考资料

djp7away

djp7away3#

我使用以下代码段:

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

xqkwcwgp4#

MySQL 8+

SELECT @@transaction_isolation; -- session
SELECT @@global.transaction_isolation; -- global
根据MySQL 8 Deprecation注解:
已删除不推荐使用的tx_isolation和tx_read_only系统变量。请改用transaction_isolation和transaction_read_only。

v64noz0r

v64noz0r5#

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

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

sdnqo3pr6#

你可以

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
2ekbmq32

2ekbmq327#

另一个查询语法:

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
wztqucjr

wztqucjr8#

显示全局隔离级别

SELECT @@GLOBAL.transaction_isolation;

显示会话隔离级别

SELECT @@SESSION.transaction_isolation;

相关问题