使用 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 的隔离级别的主要内容,如果未能解决你的问题,请参考以下文章