所以这不是我的强项,但这是我对情况的基本了解:
如果同一应用程序的两个线程都试图同时执行相同的查询,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表,如果这很重要,所以我认为有自动锁定。
答案 0 :(得分:0)
无论哪个会话发出查询,首先获得锁定。另一个会话将阻塞,直到锁定被释放,然后正常进行。
它们无法同时发生。数据库引擎阻止了这一点。
InnoDB"自动"虽然还有表锁发生,但锁定更加细化(直到行)。感谢MVCC,InnoDB中的选择查询通常不被阻止,这与MyISAM的表锁定方案不同(并且如查询所示,手动编写锁定表)。
您可以通过设置InnoDB isolation level来微调所发生的事情。