Saya baru-baru ini menjalankan permintaan pembaruan terhadap 100.000 catatan. Saya menyadari bahwa saya telah membuat kesalahan ketika permintaan sedang berjalan dan dengan cepat mencabut kabel jaringan.
Apakah permintaan pembaruan
- hentikan pemrosesan dan kembalikan sepenuhnya?
- lanjutkan pemrosesan hingga selesai dan komit?
- hentikan pemrosesan dan biarkan hanya sebagian dari baris target yang diperbarui?
sql-server
network
Robocop
sumber
sumber
Jawaban:
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):
(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:
Ambil ini:
Kemudian, jika pembaruan itu memang benar, Anda dapat menyorot
COMMIT
bagian itu dan menjalankannya. Jika tidak, Anda dapat dengan tenang menyorotROLLBACK
bagian itu dan menjalankannya. Anda bahkan dapat menggunakan peralatan tambahan seperti SSMS Tools Pack untuk mengeditNew 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.
sumber
@ Harun benar. Membuat transaksi sebelum perintah Anda adalah taruhan terbaik Anda. Jika Anda tidak ingat untuk melakukan itu maka satu opsi adalah masuk ke
Tools-Options
pengaturan dan nyalakanSET IMPLICIT_TRANSACTIONS
. Ini akan secara otomatis memulai transaksi segera setelah perintah tertentu dijalankan. Ini termasukUPDATE
,DELETE
dll. Ini tampaknya daftar yang cukup lengkap dari perintah apa pun yang akan menghasilkan"change"
sesuatu.SELECT
juga termasuk dalam daftar danwill
memulai transaksi. Anda dapat melihat daftar lengkap perintah yang memulai transaksi akan pengaturan ini di sini . Itu tidak akan membuat transaksi jika sudah dimulai. Sekarang sisi negatifnya adalah Anda harus mengingatCOMMIT
setelah perubahan apa pun dilakukan.CATATAN: Berdasarkan saran @ Harun saya akan menekankan kembali ini.
Pada dasarnya Anda menjual lupa untuk
BEGIN
suatu transaksi dan mengacaukan sesuatu, untuk lupa untukCOMMIT
transaksi dan setelah itu tergantung jika Anda membiarkannya terbuka dan kemudian pergi untuk hari itu. Saya memang menguji hanya menutup jendela permintaan berpikir itu akan memutar kembali transaksi saya, namun itu meminta saya jika saya ingin melakukan atau mengembalikan transaksi.sumber
SELECT
akan memulai transaksi (yang juga didokumentasikan dalam tautan yang Anda poskan)saya pikir itu sangat tergantung:
jika perintah sudah mencapai server sebelum Anda mencabut kabel jaringan, perintah masih akan terus berjalan secara normal.
jika Anda memiliki TransactionScope (digunakan dalam .Net, tidak yakin bahasa lain) untuk merangkum semua perintah pembaruan, Anda mungkin dapat menghentikan transaksi yang hanya akan dilakukan jika transactionScope.Complete () belum dijalankan, tetapi tidak ada jaminan .. .
sumber