問題タブ [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 for update を使用する完全な例を探していますが、グーグルで見つけられませんでした。単一の行をロックして列を更新する必要があります。次のコードは機能しません (永久にブロックされます)。

コミットは必要ですか? それ、どうやったら出来るの?私が知る限り、あなたがする必要があるのは: begin transaction select ... for update update commit

0 投票する
2 に答える
123594 参照

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があります。あれは正しいですか?

質問2SERIALIZABLEトランザクション分離READ_COMMITTEDを使用するのはSELECT ... FOR UPDATEいつですか?

回答は移植可能であることが期待されます(データベース固有ではありません)。それが不可能な場合は、その理由を説明してください。

0 投票する
2 に答える
2088 参照

python - sqlalchemy for update nowwait

sqlalchemyのドキュメントには、PostgreSQL 8.1 以降では Query.with_lockmode('update_nowait') を使用して「FOR UPDATE NOWAIT」を指定できると記載されています。FOR UPDATE だけでなく FOR UPDATE NOWAIT を追加する方法を知っている人はいますか?

SQL:

0 投票する
1 に答える
386 参照

sql - 更新ロックの選択

ストアド プロシージャ内のレコードの (複数のセッションによる) 同時更新を防止したいと考えています。

1.私は、更新したい特定の行にSELECT FOR UPDATEステートメントを使用しています。これにより、レコードがロックされます。

  1. 私は今、このレコードを更新してからコミットします。したがって、ロックが解除され、別のユーザー/セッションが作業できるようになります。

ただし、プロシージャを実行しようとすると、同時更新が発生していることがわかります。これは、SELECT FOR UPDATE が正常に機能していないことを意味します。

Pls はいくつかの提案を提供します。

サンプルコードは以下の通りです:

複数のユーザー環境で、SELECT FOR UPDATE ロックが発生していないことを確認しています。

2 台の異なるコンピューター (セッション) でシナリオをテストしました。これが私がやったことです。

  1. 1 台のコンピューターから、SELECT FOR UPDATE ステートメントを実行しました -- 行をロックしています。
  2. 別のコンピューターから、同じレコードに対して UPDATE ステートメントを実行します。
  3. 更新が行われず、更新ステートメントの SQL 実行が完了していません。

    レコードに対して SELECT FOR UPDATE を発行すると、いつロックが解除されますか。

0 投票する
1 に答える
18786 参照

mysql - SELECT FOR UPDATE を使用する理由

私たちが使用している目的について質問がありSELECT FOR UDPATEますか? それは正確に何をしますか?

テーブルから行を選択し、同じ行を更新する必要がある 2 つのテーブルがあります。

例えば:

クエリを選択

クエリを更新

私の質問- これは更新が完了するまで読み取り操作を本当にロックしますか、それとも正確には何を処理しますか?

私の考えは、私の更新が完了するまで、誰もこの行から/への読み取り/更新ができないということです..

ありがとう!

0 投票する
1 に答える
2409 参照

sql - 複数の行/結果を持つクエリで select for update はどのように機能しますか?

したがって、このトランザクションを考えると:

これにより複数の行/結果が得られると仮定すると、データベースはすべての結果をすぐにロックしますか? または、一度に 1 行ずつロックします。

後者が当てはまる場合、このクエリを同時に実行すると、デッドロックが発生する可能性がありますか?

したがって、この問題を解決するには、順序の一貫性を維持するために order by を追加する必要がありますか?