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

时间:2017-01-24 10:31:43

标签: mysql database transactions

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

6 个答案:

答案 0 :(得分:10)

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

SELECT @@transaction_ISOLATION;

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

SELECT @@global.transaction_ISOLATION;

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

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

6。当前交易水平

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

要知道此值,您必须从会话级别(在创建交易时)以及在创建交易之前是否设置了“下一个交易级别”来推断出该值。

参考

答案 2 :(得分:2)

我在google上做了一些搜索,发现如果有MySQL 5.1+那么你可以通过触发查询来找出隔离级别

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

答案 3 :(得分:2)

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 代替。

答案 4 :(得分:1)

我使用以下代码段:

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

答案 5 :(得分:0)

您可以

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