問題タブ [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 for update を使用する完全な例を探していますが、グーグルで見つけられませんでした。単一の行をロックして列を更新する必要があります。次のコードは機能しません (永久にブロックされます)。
コミットは必要ですか? それ、どうやったら出来るの?私が知る限り、あなたがする必要があるのは: begin transaction select ... for update update commit
mysql - SELECT ... FORUPDATEを使用する場合
背後にあるユースケースを理解するのを手伝ってください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を使用して、スレッド1が完了するまでSELECT id FROM rooms FOR UPDATE
スレッド2が削除されないようにする必要rooms
があります。あれは正しいですか?
質問2:SERIALIZABLE
トランザクション分離READ_COMMITTED
を使用するのはSELECT ... FOR UPDATE
いつですか?
回答は移植可能であることが期待されます(データベース固有ではありません)。それが不可能な場合は、その理由を説明してください。
python - sqlalchemy for update nowwait
sqlalchemyのドキュメントには、PostgreSQL 8.1 以降では Query.with_lockmode('update_nowait') を使用して「FOR UPDATE NOWAIT」を指定できると記載されています。FOR UPDATE だけでなく FOR UPDATE NOWAIT を追加する方法を知っている人はいますか?
SQL:
sql - 更新ロックの選択
ストアド プロシージャ内のレコードの (複数のセッションによる) 同時更新を防止したいと考えています。
1.私は、更新したい特定の行にSELECT FOR UPDATEステートメントを使用しています。これにより、レコードがロックされます。
- 私は今、このレコードを更新してからコミットします。したがって、ロックが解除され、別のユーザー/セッションが作業できるようになります。
ただし、プロシージャを実行しようとすると、同時更新が発生していることがわかります。これは、SELECT FOR UPDATE が正常に機能していないことを意味します。
Pls はいくつかの提案を提供します。
サンプルコードは以下の通りです:
複数のユーザー環境で、SELECT FOR UPDATE ロックが発生していないことを確認しています。
2 台の異なるコンピューター (セッション) でシナリオをテストしました。これが私がやったことです。
- 1 台のコンピューターから、SELECT FOR UPDATE ステートメントを実行しました -- 行をロックしています。
- 別のコンピューターから、同じレコードに対して UPDATE ステートメントを実行します。
更新が行われず、更新ステートメントの SQL 実行が完了していません。
レコードに対して SELECT FOR UPDATE を発行すると、いつロックが解除されますか。
mysql - SELECT FOR UPDATE を使用する理由
私たちが使用している目的について質問がありSELECT FOR UDPATE
ますか? それは正確に何をしますか?
テーブルから行を選択し、同じ行を更新する必要がある 2 つのテーブルがあります。
例えば:
クエリを選択
クエリを更新
私の質問- これは更新が完了するまで読み取り操作を本当にロックしますか、それとも正確には何を処理しますか?
私の考えは、私の更新が完了するまで、誰もこの行から/への読み取り/更新ができないということです..
ありがとう!
sql - 複数の行/結果を持つクエリで select for update はどのように機能しますか?
したがって、このトランザクションを考えると:
これにより複数の行/結果が得られると仮定すると、データベースはすべての結果をすぐにロックしますか? または、一度に 1 行ずつロックします。
後者が当てはまる場合、このクエリを同時に実行すると、デッドロックが発生する可能性がありますか?
したがって、この問題を解決するには、順序の一貫性を維持するために order by を追加する必要がありますか?