是否“用于更新”?行阻塞也适用于连接表吗?

发布于 2024-12-03 08:29:13 字数 168 浏览 2 评论 0原文

我在一个事务中进行 2 个查询:SELECT(包含 JOIN 子句)和 UPDATE。要求所选行中的数据在更新完成之前不会更改,因此我使用 FOR UPDATE 子句。我的问题是:“for update”是否仅适用于从 FROM 子句中指定的表中选择的部分数据,或者也适用于连接表中的数据?我的数据库管理系统是MySql。

I make 2 queries in a transaction: SELECT (containing JOIN clause) and UPDATE. It is required that data in selected rows don't change before the update is done, so i'm using FOR UPDATE clause. My question is: does the 'for update' works only for part of data selected from table specified in FROM clause or for data from joined tables also? My DBMS is MySql.

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

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

发布评论

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

评论(1

嘴硬脾气大 2024-12-10 08:29:13

文档只是说锁定已打开读取的行不排除连接表,因此它应该位于所有连接表的所有记录上。如果您只想锁定其中一个表中的行,您可以单独执行此操作:“SELECT 1 FROM keytable WHERE ... FOR UPDATE”。

也就是说,这并不是为了简单地阻止 SELECT 和 UPDATE 之间的更新而需要的。 SELECT 上的读锁已经做到了这一点。 FOR UPDATE 的目的是防止另一个事务读取行,从而可能导致死锁,因为在另一个事务释放其读锁之前无法应用 UPDATE。

The documentation simply says that the lock is on rows read without excepting joined tables, so it should be on all records on all the joined tables. If you want to lock only the rows in one of the tables, you can do that separately: 'SELECT 1 FROM keytable WHERE ... FOR UPDATE'.

That said, this is not needed to simply prevent an update between the SELECT and UPDATE. The read lock on the SELECT already does this. The purpose of the FOR UPDATE would be to prevent another transaction from reading the rows and thus potentially causing a deadlock because the UPDATE can not be applied until the other transaction releases its read lock.

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