首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MySQL InnoDB中锁定事务期间

问在MySQL InnoDB中锁定事务期间
EN

Stack Overflow用户
提问于 2016-06-15 00:36:32
回答 1查看 75关注 0票数 0

我想知道在MySQL (InnoDB)中的事务中修改的所有表是否都锁定了整个事务?

我有一个会话,更新版本表中的“最新版本”,然后为新版本的几个GBs创建一个新表。另一个会话持续地获取最新版本的数据,然后获取该最新版本的数据;我发现这个会话有时会返回0行数据。

下面是SQL中的一个简化示例:

第1场会议

假设我们已经有了一个表data_v41,而version_table中的latest_version是41。此会话将数据更新为最新版本。

代码语言:javascript
复制
BEGIN TRANSACTION;

-- Increment the latest version...
UPDATE version_table SET latest_version = 42;

-- Create a new table for loads of data...
CREATE TABLE data_v42 (id int NOT NULL AUTO_INCREMENT, data TEXT);

-- Insert a few GBs of data here (so this is quite slow to write to disk)...
INSERT INTO data_v42 VALUES (...);
INSERT INTO data_v42 VALUES (...);
...

COMMIT;

第2场会议

此会话从version表中读取最新版本,然后使用该数字选择从中读取最新数据的表:

代码语言:javascript
复制
-- Say this returns 42 and we use that number in the 2nd query...
SELECT latest_version FROM version_table;

-- Is it possible for this query to return 0 rows?
SELECT * FROM data_v42;

会话2有时似乎返回0行数据,这使我相信在将任何数据插入到新表之前设置了最新版本。这似乎不符合事务是原子的..。

在插入所有数据GBs后,是否需要重新安排会话1中的查询以更新版本?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-15 02:04:53

为了在session2中反射数据,需要重新排序这些查询

由于提交是在插入所有数据之后,事务可能会花费一定的时间,这取决于要插入的数据和数据量。

因此,该表将在您的另一个会话中为空,而session1中的create将提交,因为它是mysql上的隐式提交操作,在插入之前完成的任何操作也将被提交。,这使得您的session2可以在版本表中获取更新的值。

索尔:

重新排序查询,以便在创建和整个insert操作之后更新version表。这将使您的系统可靠。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37824317

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档