【发布时间】:2017-01-24 10:31:43
【问题描述】:
我想知道当前 Mysql 数据库设置的隔离级别。怎么能查出来?我尝试在谷歌上搜索它,但没有找到它。
【问题讨论】:
标签: mysql database transactions
我想知道当前 Mysql 数据库设置的隔离级别。怎么能查出来?我尝试在谷歌上搜索它,但没有找到它。
【问题讨论】:
标签: mysql database transactions
检查全局事务级别(mysql8+)
SELECT @@transaction_ISOLATION;
检查会话事务级别(mysql8+)
SELECT @@global.transaction_ISOLATION;
【讨论】:
@@global.transaction_ISOLATION 当前会话变量吗?
在 MySQL/MariaDB 中可能有六个不同的事务隔离级别值 - 它们可能有不同的值。它们是:
你想知道它的价值的原因,将决定你需要哪一个(或多个)。
此外,请注意获得的级别何时会发生变化 - 有时会因您无法控制的事情而发生变化。
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 ... 设置,该级别将覆盖该会话中创建的下一个事务的会话级别和全局级别。之后的下一个事务将恢复使用会话级别(除非再次发出另一个设置事务隔离级别命令)。
要知道这个值,你必须跟踪你是如何使用设置事务隔离级别的(如果你曾经使用过的话)。
6.当前交易水平
没有办法查询这个。 (是MySQL bug #53341的主题。)
要知道这个值,您必须从会话级别(在创建事务时)推断它是什么,以及您是否在创建事务之前立即设置了“下一个事务级别”。
参考文献
【讨论】:
我使用下面的sn-p:
mysql> SELECT @@TX_ISOLATION;
+-----------------+
| @@TX_ISOLATION |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set, 1 warning (0.00 sec)
【讨论】:
我在 google 上进行了更多搜索,发现如果有 MySQL 5.1+,那么您可以通过触发以下查询来找出隔离级别
SELECT * FROM information_schema.session_variables
WHERE variable_name = 'tx_isolation';
【讨论】:
MySQL 8+
SELECT @@transaction_isolation; -- session
SELECT @@global.transaction_isolation; -- global
根据 MySQL 8 Deprecation notes:
已弃用的 tx_isolation 和 tx_read_only 系统变量具有 被移除。使用 transaction_isolation 和 transaction_read_only 而是。
【讨论】:
你可以
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
【讨论】: