如果两个mySQL查询都试图同时锁定同一行会发生什么?

时间:2015-02-04 20:01:56

标签: mysql locking semaphore

所以这不是我的强项,但这是我对情况的基本了解:

如果同一应用程序的两个线程都试图同时执行相同的查询,MySQL将遇到错误。您可以通过在写入表之前锁定表(或行)来防止这种情况。但是,如果锁定请求同时发生怎么办?

e.g。你有一张像这样的表:

#my_table
---------------
| key | value |
---------------
|  1  |  foo  |
---------------
|  2  |  bar  |
---------------

然后我在我的应用程序中编写一个类似

的查询
LOCK TABLES my_table WRITE;
UPDATE my_table SET value = RAND() WHERE key = 2;
UNLOCK TABLES;

并且通过一些奇迹,这个应用程序的两个实例在完全相同的毫秒(纳秒?)内发生了什么?其中一个LOCK请求会阻止另一个吗?而且,如果是这样,MySQL如何决定一个块以及哪一个继续。在第一次发布后,第二个LOCK是否仍会通过?

这是一个InnoDB表,如果这很重要,所以我认为有自动锁定。

1 个答案:

答案 0 :(得分:0)

无论哪个会话发出查询,首先获得锁定。另一个会话将阻塞,直到锁定被释放,然后正常进行。

它们无法同时发生。数据库引擎阻止了这一点。

InnoDB"自动"虽然还有表锁发生,但锁定更加细化(直到行)。感谢MVCC,InnoDB中的选择查询通常不被阻止,这与MyISAM的表锁定方案不同(并且如查询所示,手动编写锁定表)。

您可以通过设置InnoDB isolation level来微调所发生的事情。