MySQL
tidak meneruskan kode kesalahan ke pemanggil dan berdasarkan kode kesalahan ini penelepon bebas memutuskan apakah ingin melakukan pekerjaan yang dilakukan hingga saat ini (mengabaikan kesalahan dengan INSERT
khusus ini pernyataan) atau untuk mengembalikan transaksi.
Ini tidak seperti PostgreSQL
yang selalu membatalkan transaksi karena kesalahan dan perilaku ini merupakan sumber dari banyak masalah.
Pembaruan:
Ini adalah praktik yang buruk untuk menggunakan ROLLBACK
tanpa syarat di dalam prosedur tersimpan.
Prosedur tersimpan dapat ditumpuk dan transaksi tidak, jadi ROLLBACK
dalam prosedur tersimpan bersarang akan memutar kembali ke awal transaksi, bukan ke keadaan eksekusi prosedur tersimpan.
Jika Anda ingin menggunakan transaksi untuk memulihkan status basis data pada kesalahan, gunakan SAVEPOINT
konstruksi dan DECLARE HANDLER
untuk mengembalikan ke savepoints:
CREATE PROCEDURE prc_work()
BEGIN
DECLARE EXIT HANDLER FOR SQLEXCEPTION ROLLBACK TO sp_prc_work;
SAVEPOINT sp_prc_work;
INSERT …;
INSERT …;
…
END;
Kegagalan pada salah satu sisipan akan mengembalikan semua perubahan yang dibuat oleh prosedur dan keluar darinya.