问题标签 [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.
mysql - SELECT ... *FOR UPDATE* 的目的是什么?
我对你为什么要指定感到困惑FOR UPDATE
——为什么数据库关心你要如何处理来自SELECT
?
编辑:对不起,我问得不好。我知道文档说它把事情变成了“锁定读取”——我想知道的是“存在哪些情况下可观察的行为在指定FOR UPDATE
和不指定之间会有所不同——也就是说,具体是做什么的锁需要?
python - SQLAlchemy - 选择更新示例
我正在寻找一个在 SQLAlchemy 中使用 select 进行更新的完整示例,但没有找到一个谷歌搜索。我需要锁定一行并更新一列,以下代码不起作用(永远阻塞):
我需要提交吗?我怎么做?据我所知,您需要:开始事务选择...用于更新更新提交
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_COMMITTED
with SELECT ... FOR UPDATE
?
答案应该是可移植的(不是特定于数据库的)。如果这不可能,请解释原因。
python - sqlalchemy 立即更新
sqlalchemy的文档说您可以使用 Query.with_lockmode('update_nowait') 在 PostgreSQL 8.1 以上指定“FOR UPDATE NOWAIT”。有谁知道如何让它添加 FOR UPDATE NOWAIT 而不仅仅是 FOR UPDATE?
sql:
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:
sql - 选择更新锁定
我想防止我的存储过程中的记录同时更新(通过多个会话)。
1.我是,对我想更新的特定行使用 SELECT FOR UPDATE 语句。这将锁定记录。
- 我现在正在更新此记录,然后提交它。所以锁被释放,现在记录可供另一个用户/会话使用。
但是,当我尝试运行该程序时,我发现正在同时更新,这意味着 SELECT FOR UPDATE 无法正常工作。
请提供一些建议。
示例代码如下:
在多用户环境中,我观察到 SELECT FOR UPDATE 锁没有发生。
我刚刚用两台不同的计算机(会话)测试了这个场景。这是我所做的。
- 从一台计算机,执行 SELECT FOR UPDATE 语句——锁定一行。
- 在另一台计算机上,对同一记录执行 UPDATE 语句。
更新没有发生,更新语句的Sql执行没有完成,即使过了很长时间。
如果我们为一条记录发出 SELECT FOR UPDATE ,什么时候会释放锁。
mysql - 为什么使用 SELECT FOR UPDATE?
我对我们使用什么目的有疑问SELECT FOR UDPATE
?它究竟是做什么的?
我有 2 个表,我需要从表中选择行并更新相同的行。
例如:
选择查询
更新查询
我的问题- 这真的会锁定读取操作,直到我的更新完成,或者它到底处理什么?
我的想法是在我的更新完成之前没有人可以读取/更新这些行。
谢谢!
multithreading - 选择更新行为
我非常了解当使用 SELECT FOR UPDATE 并且发生另一个 SELECT/UPDATE 时更新行时会发生什么。但是当使用 SELECT FOR UPDATE 发生两个请求时会发生什么。
例如:
- 线程 A开始一个事务并在一行上执行 SELECT FOR UPDATE 并检索一些信息并开始一个需要时间的 HTTP 请求。在调用返回后,事务被提交并且会话被关闭。
- 当 A 等待请求时,线程 B开始一个新事务并在同一行上执行 SELECT FOR UPDATE。它会检索信息并继续其上的 HTTP 请求,还是会等待线程 A 提交/执行更新,然后从行中检索数据。
我不在乎一旦请求返回并且更新表的时间到来时会发生什么。用于更新的第二个将抛出或更新行上最后可能的数据。
但是实际的 HTTP 请求会由他们俩完成吗?换句话说,在这种情况下 SELECT FOR UPDATE 可以用作(滥用)线程同步机制吗?
sql - select for update 如何适用于具有多行/结果的查询?
因此,鉴于此交易:
假设这给出了多行/结果,数据库会立即锁定所有结果吗?或者它会一次锁定一排。
如果后者为真,这是否意味着同时运行此查询会导致死锁?
因此,需要添加一个 order by 来保持订单的一致性来解决这个问题吗?