【问题标题】:how to implement implicit row level locking in innodb? [closed]如何在 innodb 中实现隐式行级锁定? [关闭]
【发布时间】:2017-02-19 23:11:35
【问题描述】:

我正在使用 MySql(innodb 存储引擎)。我想在更新语句上实现行级隐式锁定。因此,没有其他事务可以同时读取或更新该行。

示例: 事务 1 正在执行 "更新客户 SET City='汉堡' WHERE CustomerID=1;"

然后,同时 Transaction2 应该不能读取或更新同一行,但 Transaction2 应该能够访问其他行。

任何帮助将不胜感激。 感谢您的宝贵时间。

【问题讨论】:

  • 你只有一个声明。 InnoDB 将在更新期间自动锁定受影响的行。交易与此有什么关系?
  • 这里的事务是指连接到数据库的线程。
  • 你能@shmosel 解释一下,当多个线程想要同时更新同一行时会发生什么?

标签: mysql sql transactions locking innodb


【解决方案1】:

如果没有其他语句支持 UPDATE,它是原子的。

例如,如果您需要在决定更改之前查看该行,那么它会稍微复杂一点:

BEGIN;
SELECT ... FOR UPDATE;
decide what you need to do
UPDATE ...;
COMMIT;

COMMIT 之前的行SELECTed 不能更改其他连接。

其他连接可以看到所涉及的行,但他们可能会看到BEGIN 开始之前的值。阅读通常无关紧要。通常重要的是BEGINCOMMIT 之间的所有内容都是“一致的”,无论其他连接中发生了什么。

您的连接可能会延迟,等待另一个连接释放某些东西(例如SELECT...FOR UPDATE)。其他一些连接可能会延迟。或者可能会出现“死锁”——当 InnoDB 决定等待不起作用时。

【讨论】:

  • 谢谢@Rick。但我想在数据库级别隐式实现这个锁,这样我就不需要开始事务了。无论连接如何,都应锁定每个更新语句行。
  • 但是为什么呢? InnoDB 的技术是为提高效率而设计的;像你描述的大锁很浪费。
  • @AanandKumar 你似乎完全错过了这个答案的第一句话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多