我想知道MySQL(InnoDB)中事务中修改的所有表是否都被整个事务锁定?
我有一个 session 更新版本表中的“最新版本”,然后为新版本的几 GB 数据创建一个新表。另一个 session 始终获取最新版本,然后获取该最新版本的数据;我发现此 session 有时会返回 0 行数据。
下面是 SQL 的简化示例:
session 1
假设我们已经有一个表data_v41
,并且version_table
中的latest_version
是41。本次 session 将数据更新到最新版本.
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;
session 2
此 session 从版本表中读取最新版本,然后使用该数字选择要从中读取最新数据的表:
-- 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;
session 2 有时似乎返回 0 行数据,这使我相信在将任何数据插入新表之前已设置最新版本。这似乎不适合原子交易......
插入所有 GB 数据后,我是否需要重新安排 session 1 中的查询以更新版本?
最佳答案
为了在 session 中反射(reflect)您的数据2,您需要对这些查询重新排序
由于提交是在插入所有数据之后进行的,因此事务可能需要花费一些时间,这取决于数据和您要插入的数据量
因此,该表在您的其他 session 中将为空,并且 session1 中的创建表将已提交,因为它是 mysql 上的隐式提交操作,在插入之前完成的任何操作也将被提交。这使得您的 session2 获取版本表中的更新值
Solr :
重新排序查询,以便在创建和插入的整个操作之后更新版本表。这将使您的系统可靠
关于mysql - MySQL InnoDB 事务期间的锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37824317/