我想知道当前Mysql数据库设置了什么隔离级别。如何找到它?我尝试在谷歌上搜索,但没有找到它。
我想知道当前Mysql数据库设置了什么隔离级别。如何找到它?我尝试在谷歌上搜索,但没有找到它。
检查会话事务级别(mysql8+)
SELECT @@transaction_ISOLATION;
检查全局事务级别(mysql8+)
SELECT @@global.transaction_ISOLATION;
transaction-isolation
条目。这可以在[mysqld]
或[server]
等部分中找到。如果 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的主题。)
要了解此值,您必须从会话级别(在创建事务时)推断出它是什么,并且如果您在创建事务之前立即设置了“下一个事务级别”,则需要考虑这一点。
参考文献
MariaDB中的transaction设置: https://mariadb.com/kb/en/library/set-transaction/
MySQL中的事务隔离级别: https://dev.mysql.com/doc/refman/8.0/en/innodb-transaction-isolation-levels.html
我使用以下代码片段:
mysql> SELECT @@TX_ISOLATION;
+-----------------+
| @@TX_ISOLATION |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set, 1 warning (0.00 sec)
MySQL 8+
SELECT @@transaction_isolation; -- session
SELECT @@global.transaction_isolation; -- global
根据 MySQL 8 的弃用说明:
已移除弃用的 tx_isolation 和 tx_read_only 系统变量。请使用 transaction_isolation 和 transaction_read_only。
我在谷歌上进行了更多的搜索,并发现如果您拥有MySQL 5.1+,则可以通过执行以下查询来查找隔离级别
SELECT * FROM information_schema.session_variables
WHERE variable_name = 'tx_isolation';
只是另一个查询语法问题:
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
你可以
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
这显示了全局隔离级别:
SELECT @@GLOBAL.transaction_isolation;
这显示了会话隔离级别:
SELECT @@SESSION.transaction_isolation;
@@global.transaction_ISOLATION
是当前会话变量吗? - Nano@@global.
才是全局的。 - Bowi