Prosedur tersimpan mendukung semua perintah transaksional, yaitu BEGIN/MULAI TRANSAKSI, COMMIT, dan ROLLBACK. Topik ini menjelaskan perilaku transaksi dalam prosedur tersimpan dan memberikan panduan tentang cara menggunakan variabel sesi Show Memahami Pemrosesan Transaksi dalam Prosedur TersimpanSecara default, setiap pernyataan SQL di dalam SP dijalankan secara berurutan dan independen dari pernyataan sebelumnya atau berikutnya. Jika SP melontarkan pengecualian yang tidak tertangani selama pelaksanaannya, pernyataan SQL apa pun yang dieksekusi sebelum kesalahan akan diproses, dan pernyataan SQL apa pun yang mengikuti kesalahan tidak akan diproses Perilaku ini juga berlaku untuk pernyataan transaksional dengan cara berikut. Jika SP melontarkan pengecualian yang tidak tertangani setelah memulai transaksi dan sebelum melakukannya, transaksi akan tetap terbuka. Transaksi yang tidak terikat tidak secara otomatis dibatalkan jika SP gagal dijalankan sepenuhnya Pertimbangkan contoh berikut, yang memulai transaksi, memasukkan bilangan bulat ke dalam tabel, dan mencoba melakukan transaksi DELIMITER // CREATE PROCEDURE insert_transaction_error() AS BEGIN START TRANSACTION; INSERT INTO t VALUES (1); -- Insert is successful CALL my_func(); -- Throws unhandled exception COMMIT; -- Commit is unreachable, and the transaction remains open END // DELIMITER ; Dalam contoh di atas, integer berhasil dimasukkan, tetapi pengecualian yang tidak tertangani mencegah transaksi dilakukan. Pada titik ini, transaksi tetap terbuka. Untuk memastikan bahwa transaksi tidak tetap terbuka tanpa henti, tambahkan rollback untuk transaksi tersebut di bagian penanganan pengecualian dari prosedur tersimpan Transaksi terbuka sering kali menghasilkan perilaku yang tidak terduga dan dapat menimbulkan konsekuensi yang serius. Misalnya, jika ada transaksi terbuka saat SP dipanggil menggunakan Variabel Sesi transcountUntuk mencegah perilaku tak terduga dan untuk menentukan apakah transaksi sedang dibuka, Anda dapat menggunakan variabel sesi Contoh berikut menunjukkan cara menggunakan DELIMITER // CREATE PROCEDURE check_trancount() AS DECLARE trancount_query QUERY(i INT) = SELECT @@trancount; BEGIN IF SCALAR(trancount_query) = 0 THEN START TRANSACTION; END IF; END // DELIMITER ;_ Pada contoh di atas, variabel sesi Di blog, kami mempelajari bagaimana transaksi adalah cara yang luar biasa untuk melindungi dari kehilangan data dan ketidakkonsistenan dengan menjamin bahwa semua operasi yang dilakukan dengan transaksi berhasil atau gagal secara bersamaan. Dalam tindak lanjut hari ini, kita akan mempelajari cara menggunakan transaksi dalam prosedur tersimpan untuk memastikan bahwa semua tabel yang terlibat tetap dalam keadaan konsisten. Jika Anda pernah membaca artikel blog saya sebelumnya, Anda mungkin tahu bahwa saya sering mengilustrasikan konsep baru menggunakan Database Sampel Sakila. Dan kenapa tidak? . Jika Anda belum mengetahuinya, Basis Data Sampel Sakila berisi data yang berkaitan dengan rantai toko persewaan film fiktif. Selain tabel dan tampilan, Anda juga akan menemukan fungsi pengguna, pemicu, kueri, dan prosedur tersimpan yang mengilustrasikan objek dan tugas database yang paling umum digunakan Salah satu prosedur tersimpan yang sangat relevan dengan blog ini adalah sp_delete_from_table. Itu menerima tiga parameter input sebagai berikut
Prosedur mengembalikan parameter keluaran @actcnt (bigint) yang berisi jumlah baris yang benar-benar dihapus Berikut definisi lengkap seperti yang ditunjukkan pada Database relasional memberi kita beberapa pernyataan penting untuk mengontrol transaksi
Karena kita tahu bahwa prosedur sp_delete_from_table akan dibatalkan jika jumlah yang diharapkan tidak cocok dengan jumlah sebenarnya dari baris yang dihapus, kita dapat menguji rollback dengan memastikan bahwa kriteria @whereclause kita akan menghapus setiap baris dalam tabel atau dengan hanya memberikan @ . Mari kita coba yang terakhir Di Navicat, kita bisa menjalankan stored procedure dari editor melalui tombol Execute. Mengkliknya menyebabkan dialog muncul yang menerima parameter input (params output dapat diabaikan) Setelah prosedur berakhir, kita dapat melihat pesan keluaran di tab Pesan. Kita dapat melihat bahwa itu telah diputar kembali seperti yang diharapkan Di blog hari ini, kita belajar cara menggunakan transaksi dalam stored procedure untuk memastikan bahwa semua tabel yang terlibat tetap dalam keadaan konsisten, apa pun hasilnya. Berminat ? Rob Gravelle tinggal di Ottawa, Kanada, dan telah menjadi Guru TI selama lebih dari 20 tahun. Saat itu, Rob telah membangun sistem untuk organisasi terkait intelijen seperti Layanan Perbatasan Kanada dan berbagai organisasi komersial. Di waktu luangnya, Rob telah menjadi artis musik yang berprestasi dengan beberapa CD dan penghargaannya Bagaimana cara menggunakan COMMIT dan ROLLBACK di MySQL?COMMIT berarti bahwa perubahan yang dibuat dalam transaksi saat ini dibuat permanen dan dapat dilihat oleh sesi lain. Pernyataan ROLLBACK, sebaliknya, membatalkan semua modifikasi yang dilakukan oleh transaksi saat ini. Baik COMMIT dan ROLLBACK melepaskan semua kunci InnoDB yang disetel selama transaksi saat ini
Bagaimana cara ROLLBACK prosedur di MySQL?Untuk melakukan ROLLBACK di Stored Procedure MySQL, kita harus mendeklarasikan exit handler di stored procedure . Ada dua jenis handler yang bisa kita miliki di MySQL Stored Procedure.
Bagaimana cara ROLLBACK setelah COMMIT di MySQL?Untuk mengembalikan transaksi saat ini dan membatalkan perubahannya, Anda menggunakan pernyataan ROLLBACK . Untuk menonaktifkan atau mengaktifkan mode komitmen otomatis untuk transaksi saat ini, Anda menggunakan pernyataan SET komitmen otomatis.
Bisakah kita menggunakan ROLLBACK dalam prosedur tersimpan?Bahkan dalam kasus di mana pengecualian menyebabkan prosedur tersimpan dibatalkan, Anda harus tetap menggunakan COMMIT atau ROLLBACK setelah prosedur keluar . |