【问题标题】:Mysql - How to find out isolation level for the transactionsMysql - 如何找出事务的隔离级别
【发布时间】:2017-01-24 10:31:43
【问题描述】:

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

【问题讨论】:

    标签: mysql database transactions


    【解决方案1】:

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

    SELECT @@transaction_ISOLATION;
    

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

    SELECT @@global.transaction_ISOLATION;
    

    【讨论】:

    • @@global.transaction_ISOLATION 当前会话变量吗?
    【解决方案2】:

    在 MySQL/MariaDB 中可能有六个不同的事务隔离级别值 - 它们可能有不同的值。它们是:

    1. 配置文件中定义的值。
    2. 用于启动 mysqld 的命令行选项中使用的值。
    3. 全局事务隔离级别。
    4. 会话事务隔离级别。
    5. 创建的下一个事务将使用的级别。
    6. 当前事务正在使用的级别。

    你想知道它的价值的原因,将决定你需要哪一个(或多个)。

    此外,请注意获得的级别何时会发生变化 - 有时会因您无法控制的事情而发生变化。

    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的主题。)

    要知道这个值,您必须从会话级别(在创建事务时)推断它是什么,以及您是否在创建事务之前立即设置了“下一个事务级别”。

    参考文献

    【讨论】:

      【解决方案3】:

      我使用下面的sn-p:

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

      【讨论】:

        【解决方案4】:

        我在 google 上进行了更多搜索,发现如果有 MySQL 5.1+,那么您可以通过触发以下查询来找出隔离级别

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

        【讨论】:

        • 请注意,此答案已过时。请参阅 MySQL 8 的其他答案。
        【解决方案5】:

        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 而是。

        【讨论】:

          【解决方案6】:

          你可以

          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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-02-24
            • 2010-11-22
            • 1970-01-01
            • 1970-01-01
            • 2011-12-17
            • 2011-09-30
            • 2015-07-21
            • 1970-01-01
            相关资源
            最近更新 更多