Xact_State() Fonksiyonu
Try-catch yapısını kullandığımızda bir hata aldığımızda transaction rollback edilir. Transaction’ın o anki durumu hakkında bilgi alıp durumuna göre işlem yapabiliriz. Transaction’ın durumu hakkında bilgi almak için xact_state() fonksiyonu kullanılır.
1–> Transaction’ın aktif olduğunu gösterir.
0–> Transaction’ın pasif olduğunu gösterir.
2–> İlgili transaction’ın sonlandırılabilir bir transaction olmadığını gösterir.
begin tran insert into Production.Culture values ('tr','Turkish',GETDATE()) if xact_state()=1 begin print 'aktif bir transaction vardır.' end rollback tran
Nested Transactions
Sql server bir transaction bitmeden başka bir transaction başlatmanıza izin verir. Nested transaction için kullanılan “commit” ifadesi en içteki transaction için kullanılır ve @@trancount değerini 1 azaltır. Commit işleminden farklı olarak rollback işlemi ise tüm transactionları sonlandırır ve @@trancount değerine 0 atanır.
Transaction Yönetimi
Açık unutulmuş bir transaction içinde sistemdeki bir objeyi kilitleyecek bir işlem yapılıyorsa transaction sonlanıncaya kadar o objeye erişilmez. Bu obje çok önemli bir tablo ise bu durum kabul edilemez. Sistem üzerindeki açık olan transactionlar kontrol edilip duruma göre başka bir obje kitleniyorsa, o transaction sonlandırılır.
Dbcc Opentran Komutu
Dbcc opentran komutu ile veri tabanındaki açılmış olan ve hala sonlandırılmamış transacationları bulabiliriz.
begin tran insert into Production.Culture values ('tr','Turkish',GETDATE()) dbcc opentran if xact_state()=1 begin print 'aktif bir transaction vardır.' end rollback tran
çıkacak olan result aşağıdadır.
Dbcc Inputbuffer Komutu
Daha önceden açılmış bir transactionın içeriğine bakıp hangi komutların o anda çalıştığını görmek için dbcc inputbuffer komutunu çalıştırabiliriz. Yukarıdaki result sonucunda görünen spid değerini parametre olarak alan dbcc inputbuffer komutuna verdiğimizde transactionın o anki içeriğini görebiliriz.
begin tran insert into Production.Culture values ('ger','Germany',GETDATE()) dbcc inputbuffer(52) if xact_state()=1 begin print 'aktif bir transaction vardır.' end rollback
Keyifli çalışmalar.