Kami memiliki aplikasi klien yang menjalankan beberapa SQL pada SQL Server 2005 seperti berikut:
BEGIN TRAN;
INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
INSERT INTO myTable (myColumns ...) VALUES (myValues ...);
COMMIT TRAN;
Ini dikirim oleh satu perintah string panjang.
Jika salah satu sisipan gagal, atau ada bagian dari perintah gagal, apakah SQL Server mengembalikan transaksi? Jika tidak mengembalikan, apakah saya harus mengirim perintah kedua untuk mengembalikannya?
Saya dapat memberikan spesifik tentang api dan bahasa yang saya gunakan, tetapi saya akan berpikir SQL Server harus menanggapi hal yang sama untuk bahasa apa pun.
sql
sql-server
sql-server-2005
transactions
jonathanpeppers
sumber
sumber
Jawaban:
Anda dapat menempatkan
set xact_abort on
sebelum transaksi Anda untuk memastikan sql memutar kembali secara otomatis jika terjadi kesalahan.sumber
xact_abort
adalah pada tingkat koneksi.Anda benar karena seluruh transaksi akan dibatalkan. Anda harus mengeluarkan perintah untuk mengembalikannya.
Anda dapat membungkus ini dalam satu
TRY CATCH
blok sebagai berikutsumber
try
), tetapi kode gagal setelahnya. Tidak ada lagi transaksi, tetapi Anda masih akan masuk kecatch
.Di sini kode dengan mendapatkan pesan kesalahan berfungsi dengan MSSQL Server 2016:
sumber
DECLARE @Var TYPE; SET @Var = ERROR;
untuk meningkatkan kesalahan dalam sql server 2005. Kalau tidak, kode di atas untuk meningkatkan kesalahan juga berfungsi untuk DB yang lebih lama. Mencoba untuk menetapkan nilai default ke variabel lokal adalah apa yang menyebabkan masalah.Dari artikel MDSN, Mengontrol Transaksi (Database Engine) .
Dalam kasus Anda, itu akan mengembalikan transaksi lengkap ketika salah satu sisipan gagal.
sumber
Tidak.
Tentu, Anda harus mengeluarkan
ROLLBACK
bukanCOMMIT
.Jika Anda ingin memutuskan apakah akan melakukan atau mengembalikan transaksi, Anda harus menghapus
COMMIT
kalimat dari pernyataan, periksa hasil dari sisipan dan kemudian menerbitkan salah satuCOMMIT
atauROLLBACK
tergantung pada hasil cek.sumber
Named Pipes
atauTCP
) memutus koneksi. Ketika koneksi terputus,SQL Server
hentikan semua perintah yang sedang berjalan dan kembalikan transaksi.