Transaksi Otonom di Oracle PL/SQL: Komit, Kembalikan

Apa itu Pernyataan TCL di PL/SQL?

TCL adalah singkatan dari Pernyataan Kontrol Transaksi. Ini akan menyimpan transaksi yang tertunda atau mengembalikan transaksi yang tertunda. Pernyataan ini memainkan peran penting karena kecuali transaksi disimpan, perubahan melalui pernyataan DML tidak akan disimpan dalam database. Di bawah ini adalah pernyataan TCL yang berbeda.

KOMIT Menyimpan semua transaksi yang tertunda
KEMBALI Buang semua transaksi yang tertunda
SAVEPOINT Menciptakan titik dalam transaksi hingga pembatalan dapat dilakukan nanti
KEMBALIKAN KE Buang semua transaksi yang tertunda sampai waktu yang ditentukan

Transaksi akan selesai dalam skenario berikut.

  • Ketika salah satu pernyataan di atas dikeluarkan (kecuali SAVEPOINT)
  • Ketika pernyataan DDL dikeluarkan. (DDL adalah pernyataan komit otomatis)
  • KAPAN pernyataan DCL dikeluarkan. (DCL adalah pernyataan komit otomatis)

Apa itu Transaksi Otonom

Dalam PL/SQL, semua modifikasi yang dilakukan pada data akan disebut sebagai transaksi. Suatu transaksi dianggap selesai bila simpan/buang diterapkan padanya. Jika tidak diberikan simpan/buang, maka transaksi tidak dianggap selesai dan perubahan yang dilakukan pada data tidak akan bersifat permanen di server.

Terlepas dari beberapa modifikasi yang dilakukan selama sesi, PL / SQL akan memperlakukan seluruh modifikasi sebagai satu transaksi dan menyimpan/membuang transaksi ini akan memengaruhi seluruh perubahan yang tertunda di sesi tersebut. Transaksi Otonom memberikan fungsionalitas kepada pengembang yang memungkinkan untuk melakukan perubahan dalam transaksi terpisah dan menyimpan/membuang transaksi tertentu tanpa mempengaruhi transaksi sesi utama.

  • Transaksi otonom ini dapat ditentukan pada tingkat subprogram.
  • Untuk membuat subprogram apa pun berfungsi dalam transaksi yang berbeda, kata kunci 'PRAGMA AUTONOMOUS_TRANSATION' harus diberikan di bagian deklaratif blok itu.
  • Ini akan menginstruksikan kompiler untuk memperlakukan ini sebagai transaksi terpisah dan menyimpan/membuang di dalam blok ini tidak akan tercermin dalam transaksi utama.
  • Penerbitan COMMIT atau ROLLBACK wajib dilakukan sebelum keluar dari transaksi otonom ini ke transaksi utama karena dalam satu waktu hanya satu transaksi yang dapat aktif.
  • Jadi, begitu kita melakukan transaksi otonom, kita perlu menyimpannya dan menyelesaikan transaksi tersebut, lalu hanya kita yang dapat kembali ke transaksi utama.

sintaks:

DECLARE
PRAGMA AUTONOMOUS_TRANSACTION; 
.
BEGIN
<executin_part>
[COMMIT|ROLLBACK]
END;
/
  • Dalam sintaks di atas, blok telah dibuat sebagai transaksi otonom.

Contoh 1: Dalam contoh ini, kita akan memahami cara kerja transaksi otonom.

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

Transaksi Otonom

Penjelasan Kode:

  • Baris kode 2: Mendeklarasikan l_salary sebagai NUMBER.
  • Baris kode 3: Mendeklarasikan prosedur nested_block
  • Baris kode 4: Menjadikan prosedur nested_block sebagai 'AUTONOMOUS_TRANSACTION'.
  • Baris kode 7-9: Menaikkan gaji pegawai nomor 1002 sebesar 15000.
  • Baris kode 10: Melakukan transaksi.
  • Baris kode 13-16: Mencetak rincian gaji karyawan 1001 dan 1002 sebelum perubahan.
  • Baris kode 17-19: Menaikkan gaji pegawai nomor 1001 sebesar 5000.
  • Baris kode 20: Memanggil prosedur nested_block;
  • Baris kode 21: Membuang transaksi utama.
  • Baris kode 22-25: Mencetak rincian gaji karyawan 1001 dan 1002 setelah perubahan.
  • Kenaikan gaji pegawai nomor 1001 tidak dilakukan karena transaksi utama telah dibuang. Kenaikan gaji pegawai nomor 1002 ini tercermin karena blok tersebut telah dijadikan transaksi tersendiri dan disimpan di akhir.
  • Jadi, terlepas dari simpan/buang pada transaksi utama, perubahan pada transaksi otonom telah disimpan tanpa mempengaruhi perubahan transaksi utama.