mysql - MySQL InnoDB 事务期间的锁定

标签 mysql transactions locking innodb acid

我想知道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/

相关文章:

mysql - 制作一个 SQL 触发器,如果​​它与已存在的行相似,则不会插入该行

mysql - 在 Mysql 中使用 LIMIT 和子查询

php - 连接 2 个表以查询缺失的条目

c# - 如何锁定具有相同ID的对象?

mysql - 如何将 `where in` 与整数片段一起使用

java - TransactionEventHandler 在 Node.setProperty() 上给出 javax.transaction.SystemException

.net - 事务队列的数据结构

c# - .net 事务范围 block 第二个事务

mysql同步查询插入

java - java中的ReentrantLock类