5

結果セットを取得したら、ステータスが「準備完了」の行をデータベースから選択するロジックがあります。ステータスを「処理中」に更新して、他のスレッドがこれらの行にアクセスできないようにする必要があります。次に、結果セットのレコードに対していくつかのロジックを実行する必要があります。処理が完了すると、レコードのステータスを再度更新して完了する必要があります。

質問:selectステートメントを実行するときに、結果セットで返される行のステータスを同時に変更できるのは私だけです。

Javaでそれを実装する良い方法があるかどうか誰かが提案できますか?

4

3 に答える 3

2

SELECT ... FOR UPDATE NOWAITトランザクションでは、処理する行を更新する前に実行できます。SELECT ... FOR SHARE NOWAIT誰かが選択した行を更新している場合、または誰かがすでにSELECT ... FOR SHARE NOWAITそれらを更新している場合、エラーで失敗します。

詳細here

于 2013-02-21T20:17:55.807 に答える
2

あなたの主な質問に答える:はい、あなたはそれをすることができます!

  1. 他の人が述べているように、それSELECT … FOR UPDATEはあなたの選択肢の1つです。

  2. もう1つは、シリアル化レベルを上げることです。この関連する回答を見て、そこにあるリンクをたどってください。

    これらの分離レベルは、シリアル化エラーである程度のトランザクションがロールバックされることを前提としているため、最大REPEATABLE READまたはトランザクションに至るまで、アプリケーション側で変更が必要になることは言及する価値があります。これは通常の予想される動作です。SERIALIZABLE

    また、より厳密な分離レベル(およびより多くのSELECT … FOR UPDATEクエリ)はパフォーマンスの低下を引き起こし、設計によっては競合状態につながる可能性があります。

  3. depesz.comのこの記事をご覧ください。これは、関連する領域で考えられる欠点の概要を示しています。

于 2013-02-21T20:48:15.127 に答える
1

あなたはおそらくあなたがテーブル/列を(あなた自身のために)ロックすることを可能にする「ロック」を探しています。優れた例は、PostgreSQLのWebサイトにあります。

http://www.postgresql.org/docs/current/static/sql-lock.html

ロックを使用すると、自分だけがテーブル/行にアクセスでき、他の人は完了するまでアクセスできないようになります。

于 2013-02-21T20:02:29.317 に答える