2011-10-20 6 views
0

私は以下のコードでSybaseにプロシージャを持っています。Sybaseの更新テーブルの中で結論を解決する

begin transaction get_virtual_acc 

    UPDATE store_virtual_acc SET isProc = 1, Uid = @uid, DateReserv = getdate() 
    from store_virtual_acc (index idx_id) WHERE id = (SELECT min(id) FROM store_virtual_acc (index idx_uid) where Uid = null and isProc = null) 

commit transaction get_virtual_acc 

問題は、手順は、複数のユーザが呼び出されたときconcurentlyそれらが同じ分(ID)を受信し、異なる値@uidとテーブルの同じ行を更新することができることです。結果はデー​​タの歪みです。 1人のユーザを更新するためにラインが既に選択されている場合、もう1人はそれを選択できないという結果を達成する必要があります。テーブルにはロックタイプのデータローがあります。 セットトランザクション分離レベル3 を次のようにトランザクションを開始する前に

は、トランザクション・レベル・ロックを使用しようとしたが、aplicationのウィッヒ呼び出し手順は、例外 ます。java.sql.SQLExceptionを得る:あなたのサーバー・コマンド(ファミリID#0、プロセスをid#530)がデッドロック状態に遭遇しました。あなたのコマンドを再実行してください。

私は何か助けに感謝します。

答えて

1

このような何か試してみてください:キーワードはホールドロック

ある

begin transaction get_virtual_acc 

UPDATE store_virtual_acc SET isProc = 1, Uid = @uid, DateReserv = getdate() 
from store_virtual_acc (index idx_id) WHERE id = (SELECT min(id) FROM store_virtual_acc (index idx_uid) holdlock where Uid = null and isProc = null) 

commit transaction get_virtual_acc 

関連する問題