Transaksi
Catatan: Transaksi adalah satu atau beberapa aksi program aplikasi yang
mengakses/mengubah isi basis data.
Transaksi merupakan bagian dari pengeksekusian sebuah program yang
melakukan pengaksesan basis data dan bahkan juga melakukan serangkaian perubahan
data. DBMS yang kita gunakan harus menjamin bahwa setiap transaksi harus dapat
dikerjakan secara utuh atau tidak sama sekali. Tidak boleh ada transaksi yang
hanya dikerjakan sebagian, karena dapat menyebabkan inkonsistensi basis data.
Untuk itu transaksi selalu merubah basis data dari satu kondisi konsisten ke
kondisi konsisten lain.
Sebuah transaksi berpeluang untuk ‘mengganggu’ integritas basis
data yang dapat membuat kondisi/hubungan antar data tidak seperti
seharusnya. Untuk menjamin agar integritas
dapat tetap terpelihara maka setiap transaksi harus memiliki sifat-sifat:
1. Atomik, dimana
semua operasi dalam transaksi dapat dikerjakan seluruhnya atau tidak sama
sekali.
2. Konsisten, dimana
eksekusi transaksi secara tunggal harus dapat menjamin data tetap konsisten
setelah transaksi berakhir.
3. Terisolasi, 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.
4. Bertahan, dimana
perubahan data yang terjadi setelah sebuah transaksi berakhir dengan baik,
harus dapat bertahan bahkan jika seandainya sistem menjadi mati.
Terhentinya suatu transaksi tidak selalu diakibatkan oleh kegagalan
insidental baik dari perangkat keras (crash) ataupun kemacetan sistem operasi
(hang). Tapi lebih sering terjadi karena
user sengaja menghentikan transaksi atau karena penghentian transaksi oleh DBMS
akibat adanya kondisi tak diinginkan, seperti deadlock atau timeout.
Sebuah transaksi dapat menghasilkan dua kemungkinan:
a. Jika
dilaksanakan lengkap seluruhnya, transaksi tersebut telah di commit dan basis data mencapai keadaan
konsisten baru.
b. Jika
transaksi tidak sukses, maka transaksi dibatalkan dan basis data dikembalikan
ke keadaan konsisten sebelumnya (rollback).
Transaksi
yang sudah di commit tidak dapat dibatalkan lagi. Jika ada kesalahan, maka harus dilakukan
transaksi lain yang membalik dampak transaksi sebelumnya.
Status-status yang dapat dicapai oleh sebuah transaksi sejak mulai
dilaksanakan hingga selesai atau batal adalah:
1. Aktif (Active), yang
merupakan status awal (initial state) sebuah transaksi yang menunjukkan
transaksi tersebut masih dieksekusi.
2. Berhasil
Sebagian (Partially Committed), yaitu keadaan yang dicapai
transaksi tepat pada saat operasi terakhir dalam transaksi selesai dikerjakan.
3. Gagal
(Failed), yang merupakan keadaan dimana sebuah transaksi
terhenti pengeksekusiannya sebelum tuntas sama sekali.
4. Batal
(Aborted), yaitu keadaan dimana sebuah transaksi dianggap
tidak/belum dikerjakan yang tentu dengan terlebih dahulu diawali dengan
mengembalikan semua data yang telah diubah ke nilai-nilai semula. (yang menjadi
tanggung jawab DBMS).
5. Berhasil
Sempurna (Committed), keadaan dimana transaksi telah dinyatakan
berhasil dikerjakan seluruhnya dan basis data telah merefleksikan
perubahan-perubahan yang memang diinginkan transaksi.
Diagram berikut ini menunjukkan aliran dan siklus peralihan status
(state) dari sebuah transaksi:
Ketika
sebuah transaksi mulai dikerjakan, maka transaksi itu berada dalam status aktif. Jika terjadi penghentian sebelum operasi
berakhir, maka transaksi segera beralih ke status gagal/failed. Namun, bila
keseluruhan transaksi selesai dikerjakan, maka transaksi itu berada pada status
berhasil sebagian/partially committed, dimana perubahan-perubahan data
masih berada di dalam memori utama yang bersifat volatile/tidak
permanen. Transaksi dalam status ini masih mungkin untuk pindah ke status
failed, karena ada pembatalan transaksi baik sengaja maupun tidak. Jika tidak
beralih ke status failed, maka nilai-nilai data yang ada di memori utama akan
direkam ke dalam disk yang bersifat permanen. Begitu proses perekaman selesai,
maka transaksi beralih ke status committed. Sementara itu, transaksi
yang berada pada status failed, maka DBMS harus menjalan proses rollback.
Proses tersebut dapat berupa:
·
Mengulangi pelaksanaan transaksi / restart,
yang dilakukan pada transaksi yang failed akbiat kemacetan perangkat keras
ataupun perangkat lunak dan bukannya penghentian transaksi secara sengaja oleh
user.
·
Mematikan transaksi / kill, yang
dilakukan untuk transaksi yang dihentikan secara sengaja oleh user atau akibat
adanya kesalahan lojik dalam penulisan aplikasi.
Begitu
salah satu dari pilihan proses tersebut selesai dilakukan, maka transaksi
berpindah ke status batal (aborted). Status berhasil sempurna/committed maupun batal/aborted
merupakan status terminasi, yaitu status akhir dalam pelaksanaan transaksi.
Operasi
Transaksi
Suatu
transaksi adalah unit terkecil dari kerja yang dapat diselesaikan atau tidak
dapat diselesaikan. Beberapa operasinya dengan diagram transisinya :
- BEGIN_TRANSACTION : memulai transaksi
- READ or WRITE : operasi baca atau tulis dari item database yang dieksekusi sebagai bagian dari transaksi
- END_TRANSACTION : operasi transaksi READ atau WRITE selesai dilakukan
- COMMIT_TRANSACTION : transaksi berakhir sukses sehingga semua perubahan (update) yang dilakukan melalui transaksi dapat dimasukkan ke database dan akan diselesaikan
- ROLLBACK (or ABORT) : transaksi berakhir dengan tidak sukses sehingga semua perubahan atau efek transaksi yang diaplikasikan ke database tidak dapat diselesaikan.
Save Point
Jika dalam sebuah
proses yang panjang, kita memerlukan beberapa titik untuk melakukan penyimpan
data. Titik itu dapat kita sebut Save Point.
Untuk menyatakan
savepoint, pernyataan adalah: SAVEPOINT(nama
savepoint); Dengan menggunakan
pernyataan savepoint, maka semua proses yang terjadi sebelum pernyataan ini
akan di commit, kemudian melanjutkan ke proses selanjutnya, tentunya pernyataan
ini harus didalam Transaksi.
Untuk mengembalikan
kondisi database ke savepoint, maka digunakan pernyataan: ROLLBACK TO SAVEPOINT (nama savepoint); Dengan ini, maka semua
proses setelah savepoint sampai pernyataan ini di remove dan kondisi database
kembali seperti pada saat setelah savepoint.
Isolasi
Transaksi
Selain dapat mengatur autocommit,
mysql juga mengizinkan pengaturan pemisahan level transaksi dengan menggunakan
perintah. Ada 4 level pemisahan transaksi:
·
Read Uncommited
mengizinkan dirty reads, nonrepeatable reads dan phantom read. Level ini
lebih baik hanyan digunakan pada database dengan data yang umum.
·
Read Commited hanya mengizinkan nonreapeatable
red dan phantom red, tetapi tidak untuk dirty red.
· Repeatable Read hanya mengizinkan phantom read,
merupakan level pemisahan transaksi utama pada mesin InnoDB.
·
Serializable Tidak mengizinkan adanya dirty
read, nonrepeatable read dan phantom read. Jika level ini digunakan, maka
database dikunci dari transaksi lain dan berjalan secara berurutan. Hanya level
ini yang tersedia untuk table BDB.
Dirty
Reads merupakan
masalah yang terjadi ketika terdapat beberapa transaksi yang mencoba untuk
mengakses satu tabel pada waktu yang sama ataupun hampir bersamaan.
Nonrepeatable Reads merupakan masalah yang
terjadi ketika ada sebuah transaksi yang sedang mengakses pembacaan terhadap
suatu databse, kemudian ketika proses tersebut masih berlangsung, ada proses
lain yang mengupdate isi database. Hal ini menyebabkan ada data yang tidak
terbaca oleh transaksi yang sedang membaca.
Phantom
Reads merupakan
masalah yang terjadi ketika transaksi kedua memperbaharui database, kemudian
transaksi pertama membaca kembali database, maka transaksi akan mendapatkan
hasil yang berbeda.
Penguncian Tabel
Yang Tidak Menggunakan Transaksi
Transaksi hanya dapat digunakan pada tabel yang
menggunakan mesin INNODB dan BDB tabel. Untuk melakukan penguncian atau
pengaturan agar tidak terjadi dirty reads, nonrepeatable reads dan phantom
reads.
Pelepasan Kunci
Terhadap Tabel
Jika tabel telah dikunci, maka
setelah proses selsai kunci harus dilepaskan agar transaksi lain bisa mengakses
tabel.