Seperti yang disebutkan oleh Nick dan Martin, status akhir kueri Anda bergantung pada apakah SQL Server mengetahui tentang penarikan kabel jaringan Anda sebelum kueri selesai. Dari Books Online (meskipun saya merasa menarik bahwa ada topik yang setara untuk ini pada 2000 , 2005 , 2008 , dan 2008 R2 , tetapi tidak pada 2012 atau 2014):
Jika kesalahan mencegah penyelesaian transaksi yang berhasil, SQL Server secara otomatis memutar kembali transaksi dan membebaskan semua sumber daya yang dimiliki oleh transaksi. Jika koneksi jaringan klien ke mesin database terputus, setiap transaksi yang belum dilunasi untuk koneksi tersebut dibatalkan saat jaringan memberitahukan mesin virtual tersebut. Jika aplikasi klien gagal atau jika komputer klien turun atau dinyalakan kembali, ini juga memutus koneksi, dan mesin database contoh memutar kembali setiap koneksi yang beredar ketika jaringan memberitahukan itu dari istirahat. Jika klien keluar dari aplikasi, transaksi yang ada dibatalkan.
(Sebagai tambahan, kata koneksi dalam kalimat terakhir ke-2 mungkin dimaksudkan sebagai transaksi . Saya tidak tahu bagaimana seseorang mengembalikan koneksi.)
Dengan cara yang sama, SQL Server dapat membatalkan atau mengulang transaksi selama pemulihan setelah server dimatikan secara tak terduga, dan ini akan tergantung pada keadaan transaksi pada saat penutupan. Saya telah melihat orang-orang menggunakan taktik ini untuk mencapai apa yang Anda coba lakukan (batalkan transaksi) dan ketika server mulai lagi, sebagian besar pekerjaan hanya dilakukan ulang (sehingga efek bersih dari reaksi spontan mereka lebih dekat) ke nol dari yang mereka harapkan).
Jadi, daripada tunduk pada ini, daripada melakukan hal-hal drastis dalam kepanikan, seperti mencabut kabel jaringan atau mematikan mesin, saya sarankan di masa depan Anda memiliki disiplin yang lebih baik tentang menjalankan permintaan ad hoc terhadap sistem penting. Misalnya, alih-alih:
UPDATE dbo.sometable
-- where *oops* I forgot this part
Ambil ini:
BEGIN TRANSACTION;
UPDATE dbo.sometable
-- where *oops* I forgot this part
-- COMMIT TRANSACTION;
-- ROLLBACK TRANSACTION;
Kemudian, jika pembaruan itu memang benar, Anda dapat menyorot COMMIT
bagian itu dan menjalankannya. Jika tidak, Anda dapat dengan tenang menyorot ROLLBACK
bagian itu dan menjalankannya. Anda bahkan dapat menggunakan peralatan tambahan seperti SSMS Tools Pack untuk mengedit New Query
template Anda untuk memasukkan boilerplate itu.
Sekarang itu masih bisa membuat Anda dalam masalah jika Anda menjalankan kueri dan kemudian jangan melakukan komit atau kembalikan, karena sekarang transaksi Anda memblokir pengguna lain. Tapi ini lebih baik daripada memodifikasi data yang tidak dapat dibatalkan.
Dan tentu saja, seperti biasa, punya cadangan yang bisa Anda andalkan.