使用 join 时 MySQL 锁定

发布于 2024-12-31 22:24:10 字数 645 浏览 0 评论 0原文

在 2 表连接查询中选择“FOR UPDATE”时,我对 mysql/innodb 锁定有疑问。示例:

2 个表 - itemsqueuequeue.id 是与 items.id(外键)的 1:1 连接。 queue.status 是带有索引的枚举。队列的行数很少,而项目表相对较大。

SELECT *
  FROM `items`
  INNER JOIN queue
    ON items.id = queue.id
  WHERE queue.status = 'new'
  FOR UPDATE;
  1. items 中的选定行是否会被独占锁定?
  2. 还获得了哪些其他锁? (显然 queue 表中所有具有 stats='new' 的行除外)。
  3. 是否存在可能导致死锁的共享锁。我在某处读到,插入将下一个键共享锁放在自动增量索引上,然后当使用 SELECT ... FOR UPDATE (在同一事务中)时,锁将其升级为独占,这很容易发生死锁 - 2 个线程可以获得共享锁,然后它们都将等待对方释放锁以获得排它锁。在这种情况下有可能吗(也听说外键可以做共享锁)。

I have question about mysql/innodb locking when selecting "FOR UPDATE" in a 2 table join query. Example:

2 tables - items, queue. queue.id is 1:1 connection to items.id (FOREIGN KEY). queue.status is enum with index. queue has very little number of rows, while items table is relatively large.

SELECT *
  FROM `items`
  INNER JOIN queue
    ON items.id = queue.id
  WHERE queue.status = 'new'
  FOR UPDATE;
  1. Will selected rows in table items be exclusively locked?
  2. What other locks are obtained? (except obviously all rows in queue table that have stats='new').
  3. Are there any shared locks that could cause deadlock. I've read somewhere that insert puts next key shared lock on the autoincrement index and then when using SELECT ... FOR UPDATE (in the same transaction) the lock is upgraded it to exclusive, it's easy a deadlock to happen - 2 threads can get the shared lock and then they both will wait each other to release the lock in order to get the exclusive lock. is it possible in this case (also heard that foreign keys make shared locks).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

可是我不能没有你 2025-01-07 22:24:10

是的,每个选定的行(*)都将被锁定。
您确实不需要担心僵局。创建一个需要相当多的时间,而当它真的发生时,主要是客户的错。

Yes every selected row(*) will be locked.
You really do not need to worry about a deadlock. It takes quite a lot to create one and when it does happend, it's mainly the clients fault.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文