Transaksi
Dalam Sistem Basis Data kita
mengenal istilah Transaksi.
Apa yang dimaksud dengan transaksi ?
Transaksi adalah kejadian yang menghasilkan data, dan lebih
jelasnya transaksi adalah satu atau beberapa aksi yang dilakukan program
aplikasi untuk mengakses atau mengubah isi basis data.
Dalam transaksi kita
mengenal commit dan rollback.
Commit adalah
tanda bahwa transaksi sudah selesai dilakukan, atau transaksi yang dilakukan
sudah menjadi data.
Rollback adalah
tanda bahwa transaksi gagal dilakukan, artinya transaksi yang diupdate harus
diulangi atau di-undo.
Tujuan transaksi ?
Sebuah transaksi tidak bisa dihapus karena untuk melindungi
tujuan transaksi itu sendiri yaitu mencegah dari kehilangan atau kerusakan
data.
Untuk menjamin agar integritas
dapat tetap terpelihara maka setiap transaksi harus memiliki sifat-sifat:
Atomicity,
dimana semua operasi dalam transaksi dapat dikerjakan seluruhnya atau tidak
sama sekali.
Consistency,
dimana eksekusi transaksi harus dapat menjamin data tetap konsisten setelah
transaksi berakhir.
Isolation,
jika pada sebuah sistem basis data terdapat sejumlah transaksi yang
dilaksanakan secara bersamaan, maka semua transaksi yang dilaksanakan pada saat
yang bersamaan tersebut harus dapat dimulai dan bisa berakhir.
Durability,
dimana perubahan data yang terjadi setelah sebuah transaksi berakhir dengan
baik, harus dapat bertahan bahkan jika seandainya sistem mati.
Pada transaksi database, dikenal
istilah locking yang berfungsi untuk menjaga integritas data. Terdapat dua buah
metode locking yaitu :
Shared Lock (S-LOCK)
Jika transaksi memiliki shared lock
pada suatu data, transaksi tersebut hanya bisa melakukan pembacaan. penggunan S-lock ini bisa dilakukan oleh banyak user dalam waktu yang bersamaan.
Exclusive Lock (X-LOCK)
Bagi transaksi yang memiliki exclusive
lock pada suatu data, transaksi tersebut dapat melakukan perubahan dan
pembacaan terhadap data tersebut. penggunaan x-lock hanya dapat dilakukan oleh 1 user saja.
jika yang menggunakan akses x-lock lebih dari satu user akan terjadi DEADLOCK.
Apa itu DEADLOCK ?
situasi dimana dua atau lebih transaksi dalam keadaan wait-state satu sama lain menunggu lock dilepaskan sebelum di mulai. atau situasi dimana hak akses bersama semua saling menunggu dimana sumber daya tidak sibuk sedangkan akses lock terkunci semua.
dan bagaimana caranya untuk menangani DEADLOCK ?
yaitu dengan menggunakan isolation , yaitu derajat pengaruh antar transaksi tertinggi.
Isolation Transaksi
Dalam transaksi database, ada 3 hal
yang harus dicegah yaitu.
Dirty Read
Transaksi membaca data dari hasil
transaksi lainnya yang gagal. Kedua transaksi tersebut berjalan bersamaan.
Non-Repeatable Read
Transaksi membaca ulang data yang
telah di baca sebelumnya karena data tersebut telah di modifikasi oleh
transaksi lainnya.
Phantom Read
Transaksi membaca sebuah data yang
telah hilang akibat dari transaksi yang lainnya.
Untuk mencegah 3 hal tersebut, maka dalam Oracle terdapat 2 level isolasi yang dapat diimplementasikan, yaitu :
Read Commited
Transaksi hanya dapat melihat perubahan data setelah transaksi lain telah commit pada data tersebut. (Seperti dalam contoh commit)
Serializable
Adalah level isolasi yang menyediakan isolasi transaksi yang paling ketat. Level ini mengemulasikan eksekusi transaksi secara serial, menjadikan transaksi dieksekusi satu setelah yang
lainnya,seperti secara serial, bukan secara bersamaan (pararel).
Tetapi aplikasi yang menggunakan level isolasi ini harus bersedia untuk mengulangi transaksi dikarenakan kegagalan pengserialan transaksi. Saat transaksi berada pada level serializable, sebuah query SELECT hanya melihat data yang di COMMIT sebelum transaksi di mulai; transaksi tersebut tidak akan pernah melihat baik data yang belum di COMMIT atau perubahan data yang terjadi selama eksekusi transaksi oleh transaksi lain yang berjalan pada waktu bersamaan (e.g. saat transaksi ini berjalan, ada transaksi lain yang melakukan COMMIT pada data). Jika pada transaksi dengan level isolaso Serializable mengandung DML (Data Manipulatin Language) yang mencoba untuk meng-update suatu data yang mungkin sudah di update pada sebuah transaksi yang belum di commit pada awal transaksi Serializable, maka perintah DML tersebut akan gagal.
Untuk mengaplikasikan level isolasi Serializable, adalah dengan menggunakan perintah :
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
Isolai level ini mencegah terjadinya Phantom Read.
Untuk lebih jelasnya , yuk kita
mulai praktikan.
Kali ini kita akan mencoba untuk
menggunakan operasi commit dan rollback. Untuk mencobanya kita buat terlebih
dahulu membuat database mahasiswa dengan table mahasiswa, dimana kita akan
mencoba menginputkan atau mengubah pada table tersebut. Berikut contoh tabelnya :
Dan kita coba untuk masukan datanya
Untuk mencoba menerapkan operator
commit, kita run sql command line nya dengan dua windows.
Pastikan kedua window sudah terkoneksi ke database mahasiswa yang akan digunakan untuk proses transaksi. Setalah itu coba lihat data ditabel mahasiswa pada sql command line yang berwarna abu.
Kerena pengguna akses X-lock yaitu user yang menggunakan command line berwarna hitam, belum memberikan commit pada proses transaksi, jadi jika sebuah transaksi belum di commit, transaksi yang dilakukan belum menjadi data, sehingga table pada command line berwarna abu masih terbaca kosong.
Jika terjadi hal seperti itu kita
gunakan operator commit, dimana commit ini merupakan penanda bahwa transaksi
sudah selesai dilakukan dan transaksi tersebut telah menjadi data . untuk
mencobanya, ketikan commit ; pada command line yang berwarna hitam. Dan hasilnya
akan menjadi seperti berikut
Kemudian kita coba untuk menginputkan data baru pada table mahasiswa, misalkan:
Perintah insert tersebut saya coba
di sql command line yang berwarna hitam, dan coba lihat apakah di command line
yang berwarna abu datanya sudah bertambah?
Ternyata terlihat perbedaannya,di command line yang berwarna abu, data masih terbaca 6 rows dan belum bertambah, nah.. jika data yang sudah diinputkan ingin dimunculkan di command line yang berwarna abu, maka perintah yang dituliskan adalah commit, sebagaimana yang telah dicontohkan diatas.
Selain
operator commit, dalam transaksi ada operator rollback yaitu perintah untuk
mengulang bahwa transaksi gagal dilakukan.
Selanjutnya kita akan menghapus data dengan nim 120001
Selanjutnya kita akan menghapus data dengan nim 120001
Namun,
Dalam kasus ini , ternyata user membatalkan penghapusan data mahasiswa dengan
nim = 120001, bagaimana caranya ?
Maka
untuk melakukan rollback terlebih dahulu kita harus menyimpan history transaksi
yang pernah kita lakukan yaitu dengan membuat savepoint, dimana savepoint
merupakan sebuah titik
aman, dimana kita telah menyelesaiakan satu atau beberapa transaksi. Jadi
ketika kita akan me- rollback sebuah transaksi maka savepoint ini akan menjadi
tujuan rollback yang akan dilakukan. Untuk itu coba kita praktekan.
Sebelum menghapus data, maka kita buat savepoint terlebih
dahulu, contohnya data1;
Setelah itu lakukan perintah sql untuk menghapus data.
maka data pada tabel mahasiswa menjadi seperti ini
Data telah terhapus,
Dan bagaimana cara membatalkan transaksi penghapusan data
tersebut ?
caranya
adalah menggunakan operator Rollback, dengan cara memanggil nama savepoint nya.
Contoh disini adalah rollback to data1
Artinya data pada table mahasiswa akan dikembalikan pada savepoint
yang telah dibuat contohnya seperti savepoint pada keadaan data1, dimana data
dengan nim 120001 belum dihapus.
Contoh kasus II :
Dari perintah yang sudah dijalankan diatas, bagaimanakah data
table yang akan muncul ?
maka lakukanlah sql pada command line seperti gambar dibawah ini
maka lakukanlah sql pada command line seperti gambar dibawah ini
Hasilnya adalah seperti ini :
Data dengan nama mahasiswa “Munaroh “ terhapus,
Namun adakah yang menemukan perbedaan lain antara table
mahasiswa di command line yang berwarna hitam dan yang abu ?
Perbedaan terjadi pada data mahasiswa dengan nim = 120004
dimana pada table command line abu, data dengan nim 120004 masih bernama Puji
R, sedangkan di command line warna hitam menjadi Puji Rahmah.
Mengapa demikian ?
Karena pada saat update data pada nim = 120004 di command
line berwarna hitam, perintah yang
dilakukan tidak di lanjutkan dengan perintah commit, jadi perubahan data terjadi
pada satu akses saja yaitu pada command line yang warna hitam saja. Sedangkan
perintah penghapusan data mahasiswa dengan nama “munaroh” dilanjutkan dengan
perintah commit, sehingga data tersebut dapat dilihat perubahannya dikedua user
yang sedang mengakses table tersebut dan hasilnya data dengan nama mahasiswa
“munaroh” berhasil dihapus.
Intinya dalam setiap transaksi yang kita lakukan, maka harus
dilakukan commit, jika tidak inputan tidak akan menjadi data. dan penggunaan rollback yang paling penting adalah pembuatan savepoint dari setiap transaksi yang telah dilakukan, karena savepoint tersebut akan menjadi patokan kemana data itu akan di rollback.
sekian untuk pembahasan materi Transaksi, semoga bermanfaat ~~
sekian untuk pembahasan materi Transaksi, semoga bermanfaat ~~