问题标签 [select-for-update]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
5 回答
7219 浏览

mysql - SELECT ... *FOR UPDATE* 的目的是什么?

我对你为什么要指定感到困惑FOR UPDATE——为什么数据库关心你要如何处理来自SELECT?

编辑:对不起,我问得不好。我知道文档说它把事情变成了“锁定读取”——我想知道的是“存在哪些情况下可观察的行为在指定FOR UPDATE和不指定之间会有所不同——也就是说,具体是做什么的锁需要?

0 投票
2 回答
2847 浏览

mysql - 选择更新

可能重复:
SELECT ... FOR UPDATE 和 MAX()

此查询中的哪些行锁定?

如果另一个用户运行此查询会发生什么?

是相关的问题。

0 投票
3 回答
35309 浏览

python - SQLAlchemy - 选择更新示例

我正在寻找一个在 SQLAlchemy 中使用 select 进行更新的完整示例,但没有找到一个谷歌搜索。我需要锁定一行并更新一列,以下代码不起作用(永远阻塞):

我需要提交吗?我怎么做?据我所知,您需要:开始事务选择...用于更新更新提交

0 投票
2 回答
123594 浏览

mysql - 何时使用 SELECT ... FOR UPDATE?

请帮助我了解背后的用例SELECT ... FOR UPDATE

问题 1SELECT ... FOR UPDATE :以下是什么时候应该使用的一个很好的例子吗?

鉴于:

  • 房间[id]
  • 标签[id,名称]
  • room_tags[room_id, tag_id]
    • room_id 和 tag_id 是外键

该应用程序想要列出所有房间及其标签,但需要区分没有标签的房间和已删除的房间。如果不使用 SELECT ... FOR UPDATE,可能发生的情况是:

  • 最初:
    • 房间包含[id = 1]
    • 标签包含[id = 1, name = 'cats']
    • room_tags 包含[room_id = 1, tag_id = 1]
  • 线程 1:SELECT id FROM rooms;
    • returns [id = 1]
  • 线程 2:DELETE FROM room_tags WHERE room_id = 1;
  • 线程 2:DELETE FROM rooms WHERE id = 1;
  • 线程 2:[提交事务]
  • 线程 1:SELECT tags.name FROM room_tags, tags WHERE room_tags.room_id = 1 AND tags.id = room_tags.tag_id;
    • 返回一个空列表

现在线程 1 认为房间 1 没有标签,但实际上房间已被删除。为了解决这个问题,线程 1 应该SELECT id FROM rooms FOR UPDATE,从而防止线程 2 删除,rooms直到线程 1 完成。那是对的吗?

问题 2:什么时候应该使用SERIALIZABLE事务隔离而不是READ_COMMITTEDwith SELECT ... FOR UPDATE

答案应该是可移植的(不是特定于数据库的)。如果这不可能,请解释原因。

0 投票
2 回答
2088 浏览

python - sqlalchemy 立即更新

sqlalchemy的文档说您可以使用 Query.with_lockmode('update_nowait') 在 PostgreSQL 8.1 以上指定“FOR UPDATE NOWAIT”。有谁知道如何让它添加 FOR UPDATE NOWAIT 而不仅仅是 FOR UPDATE?

sql:

0 投票
1 回答
77012 浏览

postgresql - Postgres SELECT ... FOR UPDATE in functions

I have two questions about using SELECT … FOR UPDATE row-level locking in a Postgres function:

  • Does it matter which columns I select? Do they have any relation to what data I need to lock and then update?

    vs

    /li>
  • I can't do a select in a function without saving the data somewhere, so I save to a dummy variable. This seems hacky; is it the right way to do things?

Here is my function:

0 投票
1 回答
386 浏览

sql - 选择更新锁定

我想防止我的存储过程中的记录同时更新(通过多个会话)。

1.我是,对我想更新的特定行使用 SELECT FOR UPDATE 语句。这将锁定记录。

  1. 我现在正在更新此记录,然后提交它。所以锁被释放,现在记录可供另一个用户/会话使用。

但是,当我尝试运行该程序时,我发现正在同时更新,这意味着 SELECT FOR UPDATE 无法正常工作。

请提供一些建议。

示例代码如下:

在多用户环境中,我观察到 SELECT FOR UPDATE 锁没有发生。

我刚刚用两台不同的计算机(会话)测试了这个场景。这是我所做的。

  1. 从一台计算机,执行 SELECT FOR UPDATE 语句——锁定一行。
  2. 在另一台计算机上,对同一记录执行 UPDATE 语句。
  3. 更新没有发生,更新语句的Sql执行没有完成,即使过了很长时间。

    如果我们为一条记录发出 SELECT FOR UPDATE ,什么时候会释放锁。

0 投票
1 回答
18786 浏览

mysql - 为什么使用 SELECT FOR UPDATE?

我对我们使用什么目的有疑问SELECT FOR UDPATE?它究竟是做什么的?

我有 2 个表,我需要从表中选择行并更新相同的行。

例如:

选择查询

更新查询

我的问题- 这真的会锁定读取操作,直到我的更新完成,或者它到底处理什么?

我的想法是在我的更新完成之前没有人可以读取/更新这些行。

谢谢!

0 投票
1 回答
181 浏览

multithreading - 选择更新行为

我非常了解当使用 SELECT FOR UPDATE 并且发生另一个 SELECT/UPDATE 时更新行时会发生什么。但是当使用 SELECT FOR UPDATE 发生两个请求时会发生什么。

例如:

  1. 线程 A开始一个事务并在一行上执行 SELECT FOR UPDATE 并检索一些信息并开始一个需要时间的 HTTP 请求。在调用返回后,事务被提交并且会话被关闭
  2. 当 A 等待请求时,线程 B开始一个新事务并在同一行上执行 SELECT FOR UPDATE。它会检索信息并继续其上的 HTTP 请求,还是会等待线程 A 提交/执行更新,然后从行中检索数据。

我不在乎一旦请求返回并且更新表的时间到来时会发生什么。用于更新的第二个将抛出或更新行上最后可能的数据。

但是实际的 HTTP 请求会由他们俩完成吗?换句话说,在这种情况下 SELECT FOR UPDATE 可以用作(滥用)线程同步机制吗?

0 投票
1 回答
2409 浏览

sql - select for update 如何适用于具有多行/结果的查询?

因此,鉴于此交易:

假设这给出了多行/结果,数据库会立即锁定所有结果吗?或者它会一次锁定一排。

如果后者为真,这是否意味着同时运行此查询会导致死锁?

因此,需要添加一个 order by 来保持订单的一致性来解决这个问题吗?