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)がデッドロック状態に遭遇しました。あなたのコマンドを再実行してください。
私は何か助けに感謝します。