sql >> データベース >  >> RDS >> Oracle

データベースでのアトミックコンペアアンドスワップ

    PKは主キーですか?それなら、これは問題ではありません。主キーをすでに知っている場合は、スポーツはありません。 pkがの場合 主キーの場合、これは明らかな質問をどのように要求します。 デキューするアイテムのpkを知っていますか...

    問題は、しない場合です。 主キーを知っていて、次の「使用可能」(つまり、status =y)をデキューし、デキュー済みとしてマークします(削除するか、status =zを設定します)。

    これを行う適切な方法は、単一のステートメントを使用することです。残念ながら、構文はOracleとSQLServerで異なります。 SQLServerの構文は次のとおりです。

    update top (1) [<table>]
    set status = z 
    output DELETED.*
    where  status = y;
    

    私は、SQLのOUTPUT句に似た例を示すために、OracleのRETURNING句に精通していません。

    他のSQLServerソリューションでは、SELECTのロックヒント(UPDLOCKを使用)が正しい必要があります。Oracleでは、推奨される方法はFOR UPDATEを使用することですが、FOR UPDATEはSQLのカーソルと組み合わせて使用​​されるため、SQLServerでは機能しません。 。

    いずれにせよ、元の投稿での動作は正しくありません。複数のセッションがすべて同じ行を選択し、すべてがそれを更新して、同じデキューされたアイテムを複数のリーダーに返すことができます。



    1. json_decode(json_encode(インデックス付き配列))はNULLを返します

    2. MySQLでリレーショナル階層をクロージャテーブルに変換するにはどうすればよいですか?

    3. OracleDATE列をタイムゾーンを使用してTIMESTAMPに移行する

    4. MySqlは英数字の主キーを自動インクリメントしますか?