使用 mySQL 的隔离级别

Posted

技术标签:

【中文标题】使用 mySQL 的隔离级别【英文标题】:Isolation Level using 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 当您提出问题时,实际包含您收到的任何错误消息非常重要。请编辑问题以显示您遇到的错误(如果有)。 【参考方案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.

更多关于Transactions、Isolation Levels和how they work.的信息

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

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

【讨论】:

以上是关于使用 mySQL 的隔离级别的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 是如何实现四大隔离级别的

2Mysql事务的隔离级别?

如何查看mysql数据库隔离级别

MySQL事务隔离级别

MySQL的默认事务隔离级别是?

图解MySQL事务隔离级别