Transaksi Otonom di Oracle PL / SQL

โšก Ringkasan Cerdas

Pernyataan Kontrol Transaksi dalam Oracle PL/SQL, khususnya COMMIT, ROLLBACK, dan SAVEPOINT, menentukan apakah perubahan DML yang tertunda akan disimpan atau dibuang. Transaksi otonom berjalan sebagai subprogram independen yang melakukan commit atau rollback secara terpisah dari transaksi utama.

  • ๐Ÿ’พ MELAKUKAN: Membuat semua perubahan DML yang tertunda menjadi permanen, mengakhiri transaksi, melepaskan kunci, dan menghapus semua titik penyimpanan.
  • ๏ธ PENGEMBALIAN: Membatalkan perubahan yang tertunda, baik seluruh transaksi atau kembali ke SAVEPOINT yang ditentukan.
  • ๐Ÿ“Œ TITIK SIMPAN: Menandai suatu titik di dalam transaksi sehingga perintah ROLLBACK TO di kemudian hari hanya dapat membatalkan sebagian pekerjaan.
  • ๐Ÿ”€ Transaksi Otonom: Direktif PRAGMA AUTONOMOUS_TRANSACTION memungkinkan subprogram untuk melakukan commit atau rollback secara otomatis.
  • ๐Ÿงพ Gunakan Kasus: Transaksi otonom cocok untuk audit dan pencatatan kesalahan yang harus tetap ada meskipun pekerjaan utama dibatalkan.
  • ๐Ÿค– Bantuan AI: Asisten AI seperti GitHub Copilot membuat draf blok COMMIT, ROLLBACK, dan PRAGMA serta menandai commit yang hilang.

Transaksi Otonom di Oracle PL/SQL dengan COMMIT dan ROLLBACK

Apa itu Pernyataan TCL di PL/SQL?

TCL adalah singkatan dari Transaction Control Statements (Pernyataan Kontrol Transaksi). Pernyataan ini berfungsi untuk menyimpan transaksi yang tertunda atau membatalkan transaksi yang tertunda. TCL memainkan peran penting, karena jika transaksi tidak disimpan, perubahan yang dilakukan melalui Pernyataan DML tidak akan disimpan secara permanen di dalam basis data. Berikut adalah berbagai pernyataan TCL dalam PL / SQL.

Pernyataan Deskripsi
KOMIT Menyimpan semua transaksi yang tertunda.
KEMBALI Membatalkan semua transaksi yang tertunda.
SAVEPOINT Membuat titik dalam transaksi yang memungkinkan dilakukannya rollback di kemudian hari.
KEMBALIKAN KE Membuang semua transaksi yang tertunda hingga titik penyimpanan yang ditentukan.

Transaksi akan selesai dalam skenario berikut:

  • Saat salah satu pernyataan di atas dikeluarkan (kecuali SAVEPOINT).
  • Saat pernyataan DDL dikeluarkan (DDL adalah pernyataan auto-commit).
  • Saat pernyataan DCL dikeluarkan (DCL adalah pernyataan auto-commit).

Menggunakan SAVEPOINT dan ROLLBACK TO

Tabel di atas memperkenalkan SAVEPOINT dan ROLLBACK TO, dan keduanya bersama-sama memberi Anda kendali sebagian atas sebuah transaksi. SAVEPOINT menandai titik bernama di dalam transaksi saat ini. ROLLBACK TO selanjutnya pada savepoint tersebut membatalkan setiap perubahan yang dilakukan setelahnya, sementara mempertahankan kendali atas transaksi yang sedang berlangsung.ping pekerjaan yang dilakukan sebelumnya tetap utuh.

Ini berguna ketika transaksi yang panjang melakukan beberapa langkah. SQL beberapa langkah dan hanya langkah terakhir yang gagal. Alih-alih membuang seluruh transaksi, Anda dapat kembali ke titik penyimpanan terakhir yang berhasil dan melanjutkan.

sintaks:

SAVEPOINT <savepoint_name>;
   -- one or more DML statements
ROLLBACK TO <savepoint_name>;

Poin-poin penting yang perlu diingat tentang titik penyimpanan (savepoint):

  • SAVEPOINT hanya ada di dalam transaksi saat ini; COMMIT atau ROLLBACK penuh akan menghapus semua savepoint.
  • Saat Anda kembali ke titik penyimpanan, semua titik penyimpanan yang dibuat setelahnya akan terhapus, tetapi titik penyimpanan yang Anda pilih untuk kembali akan tetap tersimpan.
  • Perintah ROLLBACK TO tidak mengakhiri transaksi; perubahan yang dilakukan sebelum savepoint tetap tertunda hingga Anda melakukan COMMIT atau ROLLBACK.
  • Jika Anda menggunakan kembali nama savepoint, SAVEPOINT yang lebih baru akan memindahkan penanda ke posisi yang lebih baru.

Karena ROLLBACK TO membiarkan transaksi tetap terbuka, Anda tetap memutuskan pada akhirnya apakah akan melakukan COMMIT perubahan yang tersisa atau membuangnya dengan ROLLBACK penuh.

Apa itu Transaksi Otonom

Dalam PL/SQL, semua modifikasi yang dilakukan pada data disebut transaksi. Suatu transaksi dianggap selesai ketika perintah simpan atau buang diterapkan padanya. Jika tidak ada perintah simpan atau buang, maka transaksi tersebut tidak dianggap selesai, dan modifikasi yang dilakukan pada data tidak akan disimpan secara permanen di server.

Secara default, PL/SQL memperlakukan semua modifikasi selama sesi sebagai satu transaksi tunggal, dan menyimpan atau membuang transaksi tersebut memengaruhi setiap perubahan yang tertunda dalam sesi. Transaksi otonom memberi pengembang kemampuan untuk melakukan perubahan dalam transaksi terpisah dan untuk menyimpan atau membuang transaksi tertentu tersebut tanpa memengaruhi transaksi sesi utama.

  • Transaksi otonom dapat ditentukan pada tingkat subprogram.
  • Untuk membuat apa pun subprogram Jika bekerja dalam transaksi yang berbeda, kata kunci PRAGMA AUTONOMOUS_TRANSACTION harus diberikan di bagian deklaratif blok tersebut.
  • Ini menginstruksikan kompiler untuk memperlakukan ini sebagai transaksi terpisah, dan menyimpan atau membuang di dalam blok ini tidak akan tercermin dalam transaksi utama.
  • Mengeluarkan perintah COMMIT atau ROLLBACK wajib dilakukan sebelum meninggalkan transaksi otonom ini dan kembali ke transaksi utama, karena pada satu waktu hanya satu transaksi yang dapat aktif.
  • Jadi, begitu transaksi otonom dimulai, transaksi tersebut harus disimpan dan diselesaikan sebelum kendali dapat kembali ke transaksi utama.

sintaks:

DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;
.
BEGIN
<execution_part>
[COMMIT|ROLLBACK]
END;
/

Dalam sintaks di atas, blok tersebut telah dijadikan transaksi otonom.

Contoh 1: Dalam contoh ini, kita akan memahami bagaimana transaksi otonom bekerja.

Tangkapan layar di bawah ini menunjukkan contoh transaksi otonom ini dan outputnya. Oracle.

Contoh transaksi otonom yang melakukan commit blok bersarang sementara transaksi utama di-rollback. Oracle PL / SQL

DECLARE
   l_salary   NUMBER;
   PROCEDURE nested_block IS
   PRAGMA autonomous_transaction;
    BEGIN
     UPDATE emp
       SET salary = salary + 15000
       WHERE emp_no = 1002;
   COMMIT;
   END;
BEGIN
   SELECT salary INTO l_salary FROM emp WHERE emp_no = 1001;
   dbms_output.put_line('Before Salary of 1001 is'|| l_salary);
   SELECT salary INTO l_salary FROM emp WHERE emp_no = 1002;
   dbms_output.put_line('Before Salary of 1002 is'|| l_salary);    
   UPDATE emp 
   SET salary = salary + 5000 
   WHERE emp_no = 1001;

nested_block;
ROLLBACK;

 SELECT salary INTO  l_salary FROM emp WHERE emp_no = 1001;
 dbms_output.put_line('After Salary of 1001 is'|| l_salary);
 SELECT salary INTO l_salary FROM emp WHERE emp_no = 1002;
 dbms_output.put_line('After Salary of 1002 is '|| l_salary);
end;

Keluaran

Before:Salary of 1001 is 15000 
Before:Salary of 1002 is 10000 
After:Salary of 1001 is 15000 
After:Salary of 1002 is 25000

Code Penjelasan:

  • Code baris 2: Mendeklarasikan l_salary sebagai NUMBER.
  • Code baris 3: Mendeklarasikan prosedur nested_block.
  • Code baris 4: Menjadikan prosedur nested_block sebagai AUTONOMOUS_TRANSACTION.
  • Code baris 7-9: Menaikkan gaji pegawai nomor 1002 sebesar 15000.
  • Code baris 10: Melakukan transaksi otonom.
  • Code baris 13-16: Mencetak rincian gaji karyawan 1001 dan 1002 sebelum perubahan.
  • Code baris 17-19: Menaikkan gaji pegawai nomor 1001 sebesar 5000.
  • Code baris 20: Memanggil prosedur nested_block.
  • Code baris 21: Membuang transaksi utama.
  • Code baris 22-25: Mencetak rincian gaji karyawan 1001 dan 1002 setelah perubahan.

Kenaikan gaji untuk karyawan nomor 1001 tidak tercermin karena transaksi utama telah dibatalkan. Kenaikan gaji untuk karyawan nomor 1002 tercermin karena blok tersebut telah dibuat sebagai transaksi terpisah dan disimpan di akhir.

Jadi, terlepas dari apakah perubahan disimpan atau dibuang pada transaksi utama, perubahan pada transaksi otonom akan disimpan tanpa memengaruhi transaksi utama.

Kapan Menggunakan Transaksi Otonom?

Transaksi otonom sangat ampuh, jadi penting untuk mengetahui kapan penggunaannya tepat. Gunakan transaksi otonom hanya untuk pekerjaan yang harus berhasil atau gagal secara independen dari transaksi utama, bukan untuk logika bisnis inti. Kasus penggunaan umum meliputi:

  • Pencatatan audit: Catat siapa yang mengubah data sensitif, kapan, serta nilai lama dan baru, sehingga log tetap ada meskipun transaksi utama dibatalkan.
  • Pencatatan kesalahan: Tulis catatan kesalahan di dalam sebuah pengecualian handler dan COMMIT, sehingga detail diagnostik tetap tersimpan sementara transaksi yang gagal dibuang.
  • Penghitung dan statistik: Majukan penghitung penggunaan atau penghitung hit yang harus tetap ada terlepas dari hasil yang diperoleh pemanggil.
  • Lakukan COMMIT di dalam trigger: Trigger tidak dapat mengeluarkan perintah COMMIT secara langsung; transaksi otonom adalah satu-satunya cara yang didukung untuk melakukannya.

Hindari transaksi otonom untuk pembaruan biasa yang seharusnya memiliki nasib yang sama dengan transaksi utama. Penggunaan yang berlebihan dapat menyembunyikan data di balik commit independen dan mempersulit proses debugging. Sebagai aturan, setiap blok otonom harus diakhiri dengan COMMIT atau ROLLBACK secara eksplisit.

Transaksi Otonom vs Transaksi Reguler

Perbedaan antara transaksi reguler (utama) dan transaksi otonom terletak pada ruang lingkup dan independensi. Tabel di bawah ini membandingkan keduanya.

Aspek Transaksi Reguler Transaksi Otonom
Cakupan Membagikan satu transaksi sesi Berjalan sebagai transaksi anak terpisah.
Efek KOMITMEN / ROLLBACK Memengaruhi semua perubahan sesi yang tertunda Hanya memengaruhi blok otonom.
Pernyataan Perilaku default PRAGMA AUTONOMOUS_TRANSACTION di bagian deklaratif
Pengaruh rollback orang tua Perubahan hilang Perubahan otonom yang telah disepakati akan dipertahankan.
Penggunaan khas Logika bisnis inti Audit dan pencatatan kesalahan

Tidak seperti yang biasa blok bersarangBerbeda dengan blok yang perubahannya selalu berbagi hasil dari transaksi yang melingkupinya, blok otonom berdiri sendiri. Memahami perbedaan ini membantu Anda memutuskan kapan sebuah blok harus independen dan kapan harus berbagi hasil dari transaksi utama.

Pertanyaan Umum Demo Slot

Oracle Menimbulkan ORA-06519 dan membatalkan pekerjaan otonom. Setiap transaksi otonom harus diakhiri dengan COMMIT atau ROLLBACK secara eksplisit sebelum kendali kembali ke transaksi utama, karena hanya satu transaksi aktif yang diizinkan pada satu waktu.

Tidak secara langsung. Trigger normal tidak dapat mengeluarkan perintah COMMIT atau ROLLBACK. Mendeklarasikan trigger, atau prosedur yang dipanggilnya, dengan PRAGMA AUTONOMOUS_TRANSACTION memungkinkan trigger tersebut untuk melakukan commit perubahannya sendiri secara independen dari pernyataan yang memicu trigger tersebut.

Tidak. Setelah transaksi induk ditangguhkan, transaksi otonom berjalan secara independen dan tidak dapat melihat perubahan yang belum dikomit oleh transaksi induk. Transaksi otonom hanya melihat data yang sudah dikomit di basis data, sehingga menunggu kunci dari transaksi induk dapat menyebabkan kebuntuan (deadlock).

Ya. Setiap pernyataan DDL, seperti CREATE, ALTER, atau DROP, secara implisit mengeluarkan perintah COMMIT sebelum dan sesudah dijalankan. Setiap DML yang tertunda dalam sesi akan di-commit secara otomatis, sehingga pernyataan DDL tidak dapat di-rollback setelahnya.

Sebuah blok otonom dapat memanggil blok otonom lainnya, dan masing-masing mengelola COMMIT atau ROLLBACK-nya sendiri. Oracle membatasi jumlah transaksi yang aktif secara bersamaan melalui parameter inisialisasi TRANSACTIONS, sehingga penataan bertingkat yang sangat dalam dari blok otonom dapat gagal.

Tidak. Perintah COMMIT membuat perubahan menjadi permanen, melepaskan kunci, dan menghapus savepoint, sehingga tidak dapat dibatalkan dengan ROLLBACK. Untuk membatalkan data yang telah di-commit, Anda harus menjalankan DML baru. Gunakan SAVEPOINT dan ROLLBACK TO untuk pembatalan sebagian sebelum melakukan commit.

Ya. Kopilot GitHub Membuat draf logika COMMIT dan ROLLBACK, blok SAVEPOINT, dan prosedur PRAGMA AUTONOMOUS_TRANSACTION dari sebuah komentar. RevPerhatikan penempatan commit dan penanganan kesalahan, karena commit yang salah tempat dapat merusak batas transaksi.

Asisten AI memindai prosedur untuk mencari pernyataan COMMIT dan ROLLBACK yang hilang atau salah tempat, commit di dalam loop, dan blok otonom yang belum ditutup. Tinjauan pembelajaran mesin ini menandai bug transaksi dan menyarankan batasan yang lebih aman sebelum kode mencapai tahap produksi.

Ringkaslah postingan ini dengan: