【发布时间】:2010-05-15 23:11:16
【问题描述】:
如果在一个 mysql 表上同时执行 INSERT 和 SELECT 哪个会先执行?
示例:假设“users”表的行数为 0。
然后这两个查询同时运行(假设它在相同的毫秒/微秒):
INSERT into users (id) values (1)
和
SELECT COUNT(*) from users
最后一个查询会返回 0 还是 1?
【问题讨论】:
如果在一个 mysql 表上同时执行 INSERT 和 SELECT 哪个会先执行?
示例:假设“users”表的行数为 0。
然后这两个查询同时运行(假设它在相同的毫秒/微秒):
INSERT into users (id) values (1)
和
SELECT COUNT(*) from users
最后一个查询会返回 0 还是 1?
【问题讨论】:
取决于您的 users 表是 MyISAM 还是 InnoDB。
如果是 MyISAM,一条语句或另一条语句会锁定表,而您几乎无法控制它,除了 locking tables 自己。
如果是 InnoDB,它是基于事务的。多版本架构允许并发访问表,SELECT 将在其事务开始的那一刻看到行数。如果同时有一个INSERT,SELECT 将看到 0 行。事实上,如果INSERT 的事务尚未提交,您甚至可以在几秒钟后看到SELECT 执行的0 行。
这两个事务不可能真正同时开始。交易保证有一定的顺序。
【讨论】:
这取决于哪个语句将首先执行。如果第一个,那么第二个将返回 1,如果第二个先执行,那么它将返回 0。即使您在具有多个物理内核的计算机上执行它们,并且由于锁定机制,它们永远不会以完全相同的方式执行时间戳。
【讨论】: