2016-05-12 13 views
0

私は、返信コードに関してsybaseについて何も知らないことを自由に認めます。私の経験は主にOracleとSQL Serverにありました。この特定のプロジェクトでは、エントリがロックされているため定期的に失敗するテーブルのバイナリフィールドに挿入する必要があります。コードを見ると、私は正常にロック状態を検出することができるようには見えません。私の現在の戦略は、データを挿入し、挿入が成功したかどうかを選択して判断し、再試行の間に数秒間スリープするスレッドを使用していない場合は再試行することです。これは、元のデータを挿入する前にエントリを変更した可能性があり、挿入しようとしているデータよりも新しい可能性のある他のデータを考慮に入れません。挿入を試行する前に行がロックされているかどうかを確認し、ロックがクリアされるのを待ってから、挿入の前に自分自身をロックする簡単な方法はありますか?あるいは、エントリがロックされていることを検出できれば、トランザクションに失敗して、手動で検査できるようにユーザーに失敗を知らせることができます。誰かが尋ねる前に、RDMSのアーキテクチャを、エントリをロックする方法に関して変更することはできません。これは、挿入を実行するコードによって処理されなければなりません。ページロックによる挿入の失敗を確認してください。

+0

'LOCK TABLE <

> IN EXCLUSIVE MODE NOWAITはあなたのテーブルで排他ロックを取得しようとします。それが失敗した場合は '@@ error!= 0'を確認してください – Meet

答えて

0

試してみてください。

BEGIN TRANSACTION 

    LOCK TABLE <<table_name>> 
     IN EXCLUSIVE MODE NOWAIT 

    IF @@error != 0 
    BEGIN 
     ROLLBACK TRANSACTION 
     PRINT 'COULD NOT ACQUIRE LOCK. EXITING ...' 
     RETURN 0 
    END 

    << your code here if it was able to lock >> 

COMMIT TRANSACTION 
+0

私はsybaseに似ていませんが、単一のレコードが検出されたことを検出しようとするとテーブル全体をロックする必要があります。更新/挿入されないようにする? – Bill

1

は、テーブル全体をロックするには動作しますが、あなただけ(あなたの質問のタイトルどおり)ページの小さい粒度を探しているなら、かなりの粗あるでしょう。 INSERTの前にSET LOCK NOWAITを実行し、挿入を実行するために必要なものにロックがあることを示すステータスコード12205の@@ ERRORをチェックすることで、実際に行うことができます。 SET LOCK WAITを実行してデフォルトを復元することを忘れないでください。そうしないと、残りのセッションにNOWAITが適用されます。

+0

ニースは、あなたがセッションのためにそれをグローバルに指定することができ、それも彼ら自身のロック機構を使用することを知っていませんでした。 – Meet

関連する問題