次のコードを使用しました。
--begin tran redist1
/*--FIRST Update
update db..tablename set column=value
where complexthing = othercomplexthing
*/
/*--SECOND Update
update db..tablename set column=replace(column,'A','1')
*/
select * from db..tablename
--rollback tran redist1
--commit tran redist1
「begin tran redist1」を強調表示して実行し、FIRST update ステートメントを強調表示して実行し、select ステートメントで同じことを行いました。うまくいったので、「commit tran redist1」をハイライトしました。
次に、「begin tran redist1」を強調表示して実行し、SECOND update ステートメントを強調表示して実行し、select ステートメントで同じことを行いました。うまくいかなかったので、「rollback tran redist1」をハイライトしました。
次に、「begin tran redist1」を強調表示して実行し、SECOND update ステートメントを強調表示して実行し、select ステートメントで同じことを行いました。今回はうまくいったので、「commit tran redist1」をハイライトしました。
さらにいくつかの update ステートメントを使用し、毎回このプロセスを繰り返しました。次に、最後の「コミット」の直後に値を変更するために「編集」ウィンドウを開きましたが、SQL サーバーは、完了したにもかかわらず、「コミット tran redist1」がブロッキング トランザクションであると言って、そのウィンドウだけでタイムアウトし続けました。もう一度コミットを実行すると、編集ウィンドウが開き、変更したデータが表示されました。
今朝、編集ウィンドウを再度開いたところ、最初のクエリとコミットを実行した直後にテーブルが戻ってきました。それ以降のクエリとコミットはすべて失われました。ただし、編集ウィンドウで手動で編集したレコードはまだ編集されていました。
毎回、「redist1」という名前を使用し、各トランザクションに応じてコミットまたはロールバックで終わることに注意してください。私の質問は、名前の再利用が私の問題の原因でしたか? 名前を再利用すると、ある種の競合が発生しますか?