私は次の行動計画が可能かどうか疑問に思いました:
簡単なデータ入力アプリケーションを実装しています。編集可能な各レコードはテーブルにあります。ユーザーは同時に複数のレコードを編集する必要があります(データ入力時間を短縮するため)。私が今やろうとしていることは、レコードにある種のロックメカニズムを実装することです。
私が最初に考えたのは、UPDATE some_table SET status ='locked' WHERE rownum = 1 RETURNING id INTO:locked_idを出力パラメーターとともに実行して(ExecuteNonQuery)、ロックされたレコードのIDを取得することでした。このIDに基づいて、別のSELECTステートメントを実行して、必要な他の情報を読み取ることができます。
上記のアプローチは単一のロックされたレコードに対して機能するように見えますが、返された複数の行に対してこれを行う方法は実際にはわかりません。-上記の例で、WHERE句が「rownum =1」ではなく「rownum<4」だった場合はどうなりますか?
私のOracleParameterはどのようになりますか?このようにreturnoracleパラメーターを指定すると(単一の行で機能します)、
OracleParameter p = cmd.Parameters.Add("ID", OracleDbType.Int32, 10, 0, ParameterDirection.Output);
ORA-24369が与えられます。ArrayBindCountと配列をパラメーターの.Valueプロパティとして使用しようとしましたが、役に立ちませんでした。
また、特定のロック方法全体に根本的な問題があると思いますか?
ありがとうございました
編集:いくつかの説明-1。ログインしたユーザーの名前などを保持できるuser_nameという列があります-私はそれをロッキングUPDATEと一緒に更新します2.私がlocked_timestampと呼ぶ別の列がありますレコードがロックされました。夜間に実行され、ロックされたレコードを「ロック解除」にリセットするバックグラウンドプロセスが存在する可能性があります。これは頻繁には発生せず、クラッシュなどのために「ロック」されたままになるレコードの割合は少ないためです。編集されたレコードの量との比較3.同時更新はOracleによって自動的に処理されることになっています。はい、各UPDATE中にトランザクションを使用します。したがって、レコードが2人のユーザーによって同時にロックされる可能性はほとんどありません。聞こえます(これを試してみます、