在 MySQL InnoDB 中的事务期间锁定
Locking during a transaction in MySQL InnoDB
我想知道 MySQL (InnoDB) 中的一个事务中修改的所有 table 是否在整个事务中被锁定?
我有一个更新版本 table 中的 "latest version" 的会话,然后为新版本的几 GB 数据创建一个新的 table。另一个会话始终获取最新版本,然后获取最新版本的数据;我发现这个会话有时 returns 0 行数据。
这是 SQL 中的一个简化示例:
第 1 节
假设我们已经有一个tabledata_v41
,而version_table
中的latest_version
是41。这个会话是更新数据到最新版本。
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 节
此会话从版本 table 读取最新版本,然后使用该编号选择要从中读取最新数据的 table:
-- 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 有时似乎 return 0 行数据,这让我相信最新版本是在任何数据插入新 table 之前设置的。这似乎不符合原子事务...
我是否需要在会话 1 中重新安排我的查询以在插入所有 GB 数据后更新版本?
为了在 session2 中反映您的数据,您需要重新排序这些查询
由于提交是在插入所有数据之后进行的,因此事务可能会花费一些时间,具体取决于数据和您插入的数据量
因此 table 在您的其他会话中将为空,并且会话 1 中的创建 table 会提交,因为它是对 mysql 任何已完成操作的隐式提交操作在插入之前也将被提交。这使您的 session2 在 版本 table
中获得更新值
索尔:
重新排序查询,以便在创建和插入版本 table 的整个操作之后更新。这将使您的系统可靠
我想知道 MySQL (InnoDB) 中的一个事务中修改的所有 table 是否在整个事务中被锁定?
我有一个更新版本 table 中的 "latest version" 的会话,然后为新版本的几 GB 数据创建一个新的 table。另一个会话始终获取最新版本,然后获取最新版本的数据;我发现这个会话有时 returns 0 行数据。
这是 SQL 中的一个简化示例:
第 1 节
假设我们已经有一个tabledata_v41
,而version_table
中的latest_version
是41。这个会话是更新数据到最新版本。
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 节
此会话从版本 table 读取最新版本,然后使用该编号选择要从中读取最新数据的 table:
-- 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 有时似乎 return 0 行数据,这让我相信最新版本是在任何数据插入新 table 之前设置的。这似乎不符合原子事务...
我是否需要在会话 1 中重新安排我的查询以在插入所有 GB 数据后更新版本?
为了在 session2 中反映您的数据,您需要重新排序这些查询
由于提交是在插入所有数据之后进行的,因此事务可能会花费一些时间,具体取决于数据和您插入的数据量
因此 table 在您的其他会话中将为空,并且会话 1 中的创建 table 会提交,因为它是对 mysql 任何已完成操作的隐式提交操作在插入之前也将被提交。这使您的 session2 在 版本 table
中获得更新值索尔:
重新排序查询,以便在创建和插入版本 table 的整个操作之后更新。这将使您的系统可靠