【问题标题】:Isolation Level using mySQL使用 mySQL 的隔离级别
【发布时间】:2015-08-19 19:45:06
【问题描述】:

我只是不明白如何形成这个查询。

问题:

如何使用 MySQL 查询隔离级别?

应该是这样的吗?

BEGIN;
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
START TRANSACTION;

Select ....

COMMIT;

【问题讨论】:

  • 代码,如图所示,应该会抛出一个错误:ERROR 1568 (25001): Transaction characteristics can't be changed while a transaction is in progress 当您提出问题时,实际包含您收到的任何错误消息非常重要。请编辑问题以显示您遇到的错误(如果有)。

标签: mysql transactions serializable isolation-level


【解决方案1】:

首先,您应该将 autocommit 设置为 0 以在最后运行提交:

SET AUTOCOMMIT = 0;

稍后,您应该设置隔离级别: (有关隔离级别的更多信息,请阅读https://dev.mysql.com/doc/refman/5.0/en/set-transaction.html

SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;

最后开发交易:

START TRANSACTION;
Select ....
/* all queries that you want */
COMMIT;

问候。

【讨论】:

    【解决方案2】:

    问题 #1:How can I query for Isolation Level using MySQL?

    MySQL 5.X

    SELECT @@GLOBAL.TX_ISOLATION;  -- SERVER DEFAULT SETTING
    SELECT @@SESSION.TX_ISOLATION; -- CURRENT SESSION SERVER SETTING
    

    MySQL 8.X

    SELECT @@GLOBAL.TRANSACTION_ISOLATION;  -- SERVER DEFAULT SETTING
    SELECT @@SESSION.TRANSACTION_ISOLATION; -- CURRENT SESSION SERVER SETTING
    

    注意:如文档所述,我无法在事务期间捕获隔离更改:

    Subsequent transactions revert to using the session value of the named characteristics.

    问题 #2:How can I use this?

    -- Capture your autocommit setting from your session.
    SET @var_AC = (SELECT @@SESSION.AUTOCOMMIT);
    -- SELECT @var_AC;
    
    SET AUTOCOMMIT = 0; -- FORCE AUTOCOMMIT OFF
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE; 
    -- SET YOUR ISOLATION LEVEL FOR THE NEXT TRANSACTION
    
    START TRANSACTION;
    -- -- ADD YOUR CODE HERE
    COMMIT;
    -- IF NEEDED REVERT YOUR AUTOCOMMIT BACK TO WHAT IT WAS BEFORE
    SET AUTOCOMMIT = @var_AC;
    

    您也可以在服务器默认值或当前会话中更改此设置,如下所示:

    SET @@GLOBAL.TRANSACTION_ISOLATION = 'transaction_characteristic'; -- Change for all FUTURE sessions.
    SET @@SESSION.TRANSACTION_ISOLATION = 'transaction_characteristic'; -- Change for the Current Session.
    SET @@TRANSACTION_ISOLATION = 'transaction_characteristic'; -- Change the next transaction setting.
    

    更多关于TransactionsIsolation Levelshow they work.的信息

    NOTE: 在所有存储的程序中,解析器将BEGIN [WORK] 视为BEGIN ... END 块的开始。

    要在此上下文中开始 transaction,请改用 START TRANSACTION

    【讨论】:

      猜你喜欢
      • 2010-12-04
      • 2011-09-09
      • 1970-01-01
      • 2022-10-14
      • 2010-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      相关资源
      最近更新 更多