Feeds RSS
Feeds RSS

Senin, 21 April 2014

Sistem Basis Data : Transaksi

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.









Mengapa seperti ini ? 
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 


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




















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 ~~