Interaksi PL/SQL dengan Oracle
6.8. Pengenalan Pemrosesan Transaksi dalam PL/SQL
Bagian ini menjelaskan bagaimana melakukan pemrosesan transaksi. Kita mempelajari teknik-teknik dasar yang melindungi konsistensi dari database kita, termasuk bagaimana mengatur apakah perubahan data ke Oracle dibuat permanen atau dibatalkan.
Pekerjaan atau tugas yang diatur oleh Oracle disebut dengan sessions. Sebuah user session dimulai ketika kita menjalankan program aplikasi atau tool Oracle dan terhubung dengan Oracle. Untuk memperbolehkan user sessions bekerja secara simultan dan berbagi sumber-sumber daya komputer, Oracle harus mengatur concurrency, pengaksesan terhadap data yang sama oleh banyak pengguna. Tanpa pengaturan concurrency yang memadai, bisa terjadi kehilangan data integrity. Sehingga, perubahan data bisa dilakukan dalam urutan yang salah.
Oracle menggunakan locks untuk mengatur akses bersama-sama terhadap data. Penguncian memberikan kita kepemilikan sementara dari sumberdaya database seperti table atau baris data. Sehingga, data tidak dapat diubah oleh pengguna yang lain sampai kita selesai dengannya. Kita tidak perlu secara eksplisit mengunci sumberdaya karena mekanisme penguncian default melindungi data Oracle dan strukturnya. Namun, kita dapat meminta data locks pada table-table atau baris-baris data ketika hal tersebut merupakan keuntungan kita untuk menimpa penguncian default. Kita dapat memilih dari beberapa modes dari penguncian seperti row share dan exclusive.
Suatu deadlock dapat terjadi ketika dua atau lebih pengguna berusaha mengakses objek yang sama. Sebagai contoh, dua pengguna yang sedang mengubah table yang sama mungkin menunggu jika setiap usaha untuk mengubah baris data sedang dikunci oleh pengguna lain. Karena setiap pengguna sedang menunggu sumberdaya yang dipegang oleh pengguna lain, tidak ada yang dapat melanjutkan hingga Oracle menghentikan deadlock dengan memberikan sinyal kesalahan kepada transaksi terakhir yang berpartisipasi.
Ketika table sedang di-query oleh satu pengguna dan diubah oleh pengguna lain pada saat yang bersamaan, Oracle membangkitkan read-consistent view dari data untuk query tersebut. Sehingga, sekali query dimulai dan selama ia diproses, data yang sedang dibaca oleh query tersebut tidak berubah. Selama aktifitas pengubahan berlanjut, Oracle mengambil snapshots dari data dan record-record pada table yang berubah dalam rollback segment. Oracle menggunakan rollback segments untuk membangun hasil-hasil query yang read-consistent dan untuk membatalkan perubahan-perubahan jika diperlukan.
6.8.1. Bagaimana Transaksi-transaksi Melindungi Database Kita
Transaksi adalah rangkaian perintah-perintah manipulasi data SQL yang melakukan unit kerja logikal. Oracle memperlakukan rangkaian perintah-perintah SQL sebagai sebuah unit sehingga seluruh perubahan yang dibawa oleh perintah-perintah tersebut committed (dibuat permanen) atau rolled back (dibatalkan) pada waktu yang sama. Jika program kita gagal pada pertengahan transaksi, database secara otomatis mengembalikannya pada posisi sebelumnya.
Perintah SQL pertama dalam program kita mengawali transaksi. Ketika satu transaksi berakhir, perintah SQL berikutnya secara otomatis mengawali transaksi yang lain. Dengan demikian, setiap perintah SQL merupakan bagian dari transaksi. Sebuah distributed transaction mengandung paling tidak satu perintah SQL yang mengubah data pada banyak titik dalam database terdistribusi (distributed database).
Perintah-perintah COMMIT dan ROLLBACK memastikan bahwa seluruh perubahan database yang ditimbulkan oleh operasi-operasi SQL dibuat permanen atau dibatalkan pada waktu yang sama. Seluruh perintah-perintah SQL yang dieksekusi sejak commit atau rollback terakhir membentuk transaksi terkini. Perintah SAVEPOINT menamai dan menandai titik terkini dalam pemrosesan transaksi.
6.8.2. Membuat Perubahan Menjadi Permanen dengan COMMIT
Perintah COMMIT mengakhiri transaksi terkini dan membuat setiap perubahan selama transaksi tersebut menjadi permanen. Sampai kita melakukan commit terhadap perubahan, pengguna-pengguna lain tidak dapat mengakses data yang telah berubah tersebut; mereka melihat data sama seperti sebelum kita melakukan perubahan.
Mari kita perhatikan transaksi sederhana yang melakukan transfer uang dari satu akun bank ke lainnya. Transaksi ini memerlukan dua perubahan karena ia mendebet akun pertama, dan kemudian mengkredit akun kedua. Dalam contoh di bawah ini, setelah proses pengkreditan akun kedua, kita melakukan commit, membuat perubahan data menjadi permanen.
BEGIN ... UPDATE accts SET bal = my_bal - debit WHERE acctno = 7715; ... UPDATE accts SET bal = my_bal + credit WHERE acctno = 7720; COMMIT WORK; END;
Perintah COMMIT membebaskan seluruh baris data dan penguncian-penguncian table. Ia juga menghapus savepoint-savepoint yang ditandai sejak commit atau rollback terakhir.
Keyword opsional WORK tidak memiliki efek apapun kecuali hanya untuk meningkatkan keterbacaan. Keyword END memberi isyarat akhir dari blok PL/SQL, bukan akhir dari transaksi. Seperti halnya blok dapat menjangkau banyak transaksi, transaksi dapat menjangkau banyak blok.
Klausa opsional COMMENT mengijinkan kita untuk menentukan komentar untuk dikaitkan dengan transaksi terdistribusi. Ketika kita melakukan commit, perubahan terhadap setiap database yang terpengaruh oleh transaksi terdistribusi dibuat permanen. Namun, jika network atau mesin gagal selama commit, keadaan dari transaksi terdistribusi menjadi tidak diketahui atau in doubt (ragu-ragu). Dalam kasus seperti itu, Oracle menyimpan teks yang ditentukan oleh COMMENT dalam data dictionary bersama dengan ID transaksi. Teks harus diapit dengan tanda petik dan memiliki panjang hingga 50 karakter. Contohnya adalah:
COMMIT COMMENT 'In-doubt order transaction; notify Order Entry';
PL/SQL tidak mendukung klausa FORCE, yang dalam SQL, melakukan commit secara manual terhadap transaksi terdistribusi yang berstatus ragu-ragu (in-doubt). Sebagai contoh, perintah COMMIT berikut ini tidak diperbolehkan:
COMMIT FORCE '23.51.54'; -- tidak diperbolehkan
6.8.3. Membatalkan Transaksi dengan ROLLBACK
Perintah ROLLBACK mengakhiri transaksi dan membatalkan perubahan-perubahan yang dibuat selama transaksi. Rollback berguna untuk dua alasan. Pertama, jika kita membuat kesalahan ketika menghapus baris data dari table, rollback mengembalikan data pertama. Kedua, jika kita memulai transaksi yang tidak dapat kita selesaikan karena munculnya exception atau gagalnya perintah SQL, rollback mengijinkan kita untuk kembali ke titik awal untuk melakukan pembetulan dan mungkin mencobanya lagi.
Mari kita perhatikan contoh berikut ini, dimana kita menambahkan informasi karyawan ke dalam tiga table berbeda. Seluruh ketiga table tersebut memiliki kolom yang menyimpan nomor karyawan dan ia dibatasi dengan unique index. Jika perintah INSERT berusaha menyimpan nomor karyawan duplikat (dobel), predefined exception DUP_VAL_ON_INDEX muncul. Dalam kasus tersebut, kita akan membatalkan seluruh perubahan, jadi kita memberikan perintah rollback dalam bagian exception handler.
DECLARE
emp_id INTEGER;
...
BEGIN
SELECT empno, ...
INTO emp_id, ...
FROM new_emp WHERE ...
...
INSERT INTO emp VALUES (emp_id, ...);
INSERT INTO tax VALUES (emp_id, ...);
INSERT INTO pay VALUES (emp_id, ...);
...
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
ROLLBACK;
...
END;
6.8.3.1. Statement-Level Rollbacks
Sebelum mengeksekusi perintah SQL, Oracle menandai implicit savepoint. Lalu, jika perintah gagal, Oracle membatalkannya secara otomatis. Sebagai contoh, jika perintah INSERT menyebabkan munculnya exception dengan berusaha menambahkan nilai duplikat ke dalam unique index, perintah aka di rollback. Hanya pekerjaan yang dimulai oleh perintah SQL yang gagal tersebut saja yang hilang. Pekerjaan yang selesai sebelum perintah tersebut dalam transaksi tetap terpelihara.
Oracle juga dapat membatalkan perintah-perintah SQL tunggal untuk menghentikan deadlocks. Oracle mengirimkan sinyal kesalahan kepada satu dari transaksi-transaksi yang berpartisipasi dan membatalkan perintah terakhir dalam transaksi tersebut.
Sebelum mengeksekusi perintah SQL, Oracle harus melakukan parse terhadapnya, yaitu, memeriksanya untuk meyakinkan bahwa ia mengikuti aturan-aturan sintaks dan mengacu kepada objek yang valid. Kesalahan-kesalahan yang terdeteksi ketika mengeksekusi perintah SQL menyebabkan rollback, namun kesalahan yang terdeteksi ketika melakukan parse perintah tidak.
6.8.4. Membatalkan Sebagian Perubahan dengan SAVEPOINT
SAVEPOINT menamai dan menandai titik terkini dalam pemrosesan transaksi. Digunakan bersama perintah ROLLBACK TO, savepoints mengijinkan kita untuk membatalkan bagian-bagian transaksi dibandingkan dengan seluruh transaksi. Dalam contoh di bawah ini, kita menandai savepoint sebelum melakukan penambahan data. Jika perintah INSERT berusaha menyimpan nilai duplikat dalam kolom empno, predefined exception DUP_VAL_ON_INDEX muncul. Dalam kasus seperti itu, kita melakukan rollback ke savepoint, membatalkan yang baru saja ditambahkan.
DECLARE
emp_id emp.empno%TYPE;
BEGIN
UPDATE emp SET ... WHERE empno = emp_id;
DELETE FROM emp WHERE ...
...
SAVEPOINT do_insert;
INSERT INTO emp VALUES (emp_id, ...);
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
ROLLBACK TO do_insert;
END;
Ketika kita melakukan roll back ke savepoint, savepoint-savepoint yang ditandai setelah setelah savepoint tersebut dihapus. Namun, savepoint dimana kita melakukan roll back tidak dihapus. Sebagai contoh, jika kita menandai lima savepoint, lalu melakukan roll back ke savepoint ketiga, hanya yang keempat dan kelima saja yang dihapus. Rollback atau savepoint sederhana menghapus seluruh savepoint yang ada.
Jika kita menandai sebuah savepoint bersama dengan recursive subprogram, instance baru dari perintah SAVEPOINT dieksekusi pada setiap level di dalam turunan recursive tersebut. Namun, kita hanya dapat melakukan roll back ke savepoint terakhir yang ditandai.
Penamaan savepoint merupakan identifiers tak terdeklarasi dan dapat digunakan kembali dalam transaksi. Hal ini menggerakkan savepoint dari posisi sebelumnya ke titik terkini dalam transaksi. Sehingga, sebuah rollback ke savepoint berpengaruh hanya terhadap bagian terkini dari transaksi kita. Contohnya adalah sebagai berikut:
BEGIN
SAVEPOINT my_point;
UPDATE emp SET ... WHERE empno = emp_id;
...
SAVEPOINT my_point; -- move my_point to current point
INSERT INTO emp VALUES (emp_id, ...);
EXCEPTION
WHEN OTHERS THEN
ROLLBACK TO my_point;
END;
Jumlah savepoint yang aktif untuk setiap session adalah tidak terbatas. Sebuah savepoint aktif adalah satu savepoint yang ditandai sejak commit atau rollback terakhir.
| Buku ini membahas berbagai macam tip dan trik yang sangat berguna bagi Anda pembaca pengguna database Oracle. Pemula, mahasiswa, programmer, maupun database administrator yang mengharapkan solusi cepat dalam menangani permasalahan-permasalahan dalam penggunaan database Oracle dapat membaca buku ini. Anda tidak harus membaca buku ini secara urut karena buku ini di susun berdasarkan topik permasalahan, dan Anda dapat membaca topik-topik yang sesuai dengan permasalahan yang Anda hadapi. Dapat di beli di toko buku Gramedia, Gunung Agung, Uranus, Karisma dsb. Harga Rp. 24.800,- (157 halaman) |


[…] Interaksi PL/SQL dengan Oracle - 6,172 viewsFungsi Baris Tunggal - 4,245 viewsData Modelling dan Database Design - 3,954 viewsMengubah Table dan Constraint - 3,213 viewsTipe-tipe Data PL/SQL - 3,145 viewsPL/SQL Subprograms - 2,742 viewsMengontrol Akses User - 2,717 viewsCollections dan Records PL/SQL - 2,654 viewsMenampilkan Data - 2,572 viewsPendahuluan - 2,555 views […]