Manajemen Transaksi
Transaksi
Transaksi adalah
sebuah unit dari eksekusi program yang mampu mengakses dan mengupdate berbagai
data yang memiliki kaitan logika transaksi itu sendiri dimana dalam menjaga
konsitensi data secara terintegrasi dipertahankan. Sebuah transaksi harus
menghasilkan konsistensi database jika sebuah transaksi tersebut sudah
dijalankan, atau dengan kata lain setelah transaksi selesai maka database harus
kembali konsisten.
Konsistensi suatu
database berkaitan erat dengan integritas data, sehingga untuk menjamin integritas
tersebut suatu database dalam menjalakan sebuah transaksi harus memiliki sifat
–ACID :
1.
ATOMIK : Dimana semua operasi dalam
transaksi harus bekerja secara utuh/total atau tidak bekerja sama sekali
(artinya pekerjaan transaksi tidak boleh dikerjakan sebagian).
2.
CONSISTEN : Dampak eksekusi dari sebuah
trnasaksi harus menjamin keadaan data yg konsisten.
3. ISOLASI
: Pada sejumlah Transaksi yang terjadi secara bersamaan , setiap transaksi
tidak boleh terpengaruh transaksi lainnya yang juga sedang berjalan walaupun
berhubungan atau menujun pada database yang sama. Hasil transaksi sementara
harur terjaga dan terlindungi dari eksekusi-eksekusi yang lain.
4.
DURABILITY : Setelah terjadinya transaksi
maka akan diikuti update atau perubahan data pada database, maka perubahan
tersebut harus tetap bertahan dan dianggap paling valid dan konsisten.
Dalam Basis Data,
Transaksi merupakan satuan unit kerja yang berisi perintah-perintah, yang
dimulai dengan klausa BEGIN TRANSACTION dan diakhiri dengan COMMIT atau
ROLLBACK.
1.
Membuat Tabel account dengan type Innodb
Type
table InnoDB adalah salah satu tipe table dalam MySql yang mengadopsi Enggine
Oracle, (beberapa type table dalam my saql adalaha Heap, ISAM,
MERGE, MyISAM, BDB dll)
namun beberapa kemampuannya terbatas. Type Tabel InnoDB memungkinkan kita
memakai transaksi yang mendukung ACID dan memiliki fasilitas row level locking.
Type Tabel InnoDB ini telah mendukung kemampuan-kemampuan dalam pengolahan data
yg besar dengan sifat
“Transaction-Safe”
diantara memiliki kemampuan Commit, Rollback dan Crash Recovery. Kemampuan –
kemapuan ini dirancang untuk kinerja yang maksimum ketika memproses data data
dengan volume besar. Type table ini memiliki kemampuan automatic crash
recovery, namun tidak dapat disetup “dipoint” mana recovery ini dilakukan
layaknya chek point recovery pada Oracle.
Untuk mengechek apakah InnoDb ada pad MySql:
Mysql> show variables li ‘%have%’
Welcome
to the MySQL monitor. Commands end with
; or \g. Your MySQL connection id is 1 to server version: 5.0.22-community-nt
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql> show variables like '%have%';
+-----------------------+--------------+
| Variable_name | Value |
+-----------------------+--------------+
| have_archive | YES |
| have_bdb | NO
|
| have_blackhole_engine | NO
|
| have_compress | YES |
| have_crypt | NO |
| have_csv | NO |
| have_example_engine | NO
|
| have_federated_engine | NO
|
| have_geometry | YES |
| have_innodb | YES |
| have_isam | NO |
| have_ndbcluster | NO |
| have_openssl | DISABLED |
| have_query_cache | YES |
| have_raid | NO |
| have_rtree_keys | YES |
| have_symlink | YES |
+-----------------------+------------------+
17 rows in set (0.12 sec)
MySql
yang didukung Type InnoDb memiliki variabel lingkungan yang disebut autocmmit.
Secara default, autocommit diatur ke 1. Jika autocommit di setup ke, kita tidak
dapat menjalankan transaksi dengan type table apapun. Dalam Hal ini, Mysql
menganggap setiap pernyataan SQL sebagai transaksi tersendiri. Agar dapat
memakai “sekumpulan” perintah/pernyataan transaksi dan dianggap masingmasing
tidak berdiri sendiri, maka kita harus meng-off kan autocommit. Nilai
autocommit diatur atau diset ke 0;
MySql> SET autocommit=0;
Contoh Praktek Seder hana tabel dibawah ini :
Tabel berisi dua kolom yaitu number
dengan tipe data integer,merupakan primary key, autoincrement dan tidak
diijinkan nilai Null. Kolom balance
bertipe float, perintahnya sebagai berikut :
create
table account ( number int not null auto_increment primary key, balance float )
type = InnoDB;
2.
Insert Data Pada tabel account
Perintah di bawah dipergunakan untuk
melakukan insert data pada tabel account, karena kolom number autoincrement
maka data yang dimasukkan hanya pada kolom balance:
insert into account (balance) values (0.0); insert into account
(balance) values (1000.0); insert into account (balance) values (2000.0);
Hasil dari insert data tersebut adalah :
mysql>
select * from account;
+--------+---------+
|
number | balance |
+--------+---------+
| 1 |
0 |
| 2 |
1000 |
| 3 |
2000 |
+--------+---------+
3
rows in set (0.05 sec)
3.
Operasi Update data pada tabel account
•
Seleksi balance pada tabel account dengan
number 2
mysql>
select balance from account where number=2;
+---------+
|
balance |
+---------+
| 1000 |
+---------+
•
Update balance menjadi 1100 mysql> update account set balance =
1100 where number = 2;
•
Update balance dengan menambahkan 500 mysql> update account set balance =
balance + 500 where number = 2;
Setiap Query tunggal seperti di atas
bersifat atomik, sebelum satu perintah selesai dieksekusi tidak ada query lain
yang dapat melakukan interupsi terhadap
perintah tersebut.
•
Update data dengan operasi transfer data 1000 dari account
number 2 ke account number 1.
update
account set balance = balance - 1000 where number = 2; update account set
balance = balance + 1000 where number = 1;
Apabila terjadi kasus gangguan
setelah proses update data pada account number 1, maka update data account
number 1 gagal. Sehingga data pada account 2 tidak valid. Karena perintah
tersebut terdiri dari dua perintah sehingga tidak atomik.
ALTERNATIFNYA
:
Alternatif yang lain adalah dengan
membuat dua perintah tersebut menjadi perintah tunggal (perintah tunggal
bersifat atomik).
mysql>update account as source, account as dest set source.balance = source.balance - 1000,
dest.balance = dest.balance + 1000 where
source.number = 2 and dest.number = 1;
Pada perintah tersebut dipergunakan
dua buah alias pada tabel account yaitu source dan dest. Dengan menggunakan dua
buah alias, dua perintah dapat dijadikan menjadi satu buah perintah sehingga
apabila satu perintah gagal maka semua gagal .
4.
Update menggunakan manajemen
transaksi
Namun Dalam banyak kasus metode
alternative diatasdi atas tidak bisa diterapkan untuk kasus yang lain, artinya
peluang kegagalan masih sangat terbuka lebar.
Solusinya adalah dengan menggunakan Manajemen
Ttransaksi:
begin
transaction;
update account set balance = balance - 1000 where number = 2;
update account set balance = balance + 1000 where number = 1; commit;
Atau dengan mengganti perintah BEGIN dengan START.
Start
transaction;
update account set balance = balance - 1000 where number = 2;
update account set balance = balance + 1000 where number = 1; commit;
Operasi Update data dapat dibatalkan
dengan memberikan perintah ROLLBACK pada transaksi tersebut :
start
transaction;
update account set balance = balance - 1000 where number = 2;
update account set balance = balance + 1000 where number = 1; select balance
from account where number = 2; rollback;
Pada perintah tersebut karena account
number nilainya menjadi -1000 setelah operasi update dilakukan maka operasi
dibatalkan dengan perintah ROLLBACK.
5.
Autocommit mode
Secara default
mysql mendukung autocommit mode. Setiap perintah manipulasi(update,insert dll)
akan dianggap sebagai perintah yang diakhiri dengan commit. Akan tetapi
autocommit mode dapat dihilangkan dengan oleh user. Untuk menghilangkannya
berikan perintah:
mysql>
set autocommit=0;
Jika perintah ini telah diberikan
maka perintah-perintah tunggal harus diakhiri dengan commit secara manual jika
akan disimpan. Apabila akan dibatalkan bisa diberikan perintah Rollback secara
manual pula. Setelah autocommit di set menjadi 0 berikan perintah berikut :
update
account set balance = balance - 1000 where number = 2; update account set
balance = balance + 1000 where number = 1;
Proses di atas tidak akan disimpan
apabila belum ada klausa COMMIT yang mengakhiri perintah tersebut. Apabila akan
disimpan maka perintah tersebut adalah :
begin
transaction;
update account set balance = balance - 1000 where number = 2;
commit; begin transaction
update account set balance = balance + 1000 where number = 1;
commit;
Untuk mengembalikan autocommit ke
default mysql perintah yang diberikan adalah :
mysql>
set autocommit=1;
6.
Menggunakan Lock
Untuk
mencegah interferensi antar
pengguna/program aplikasi yang melakukan manipulasi pada database digunakan
metode isolasi menggunakan klausa Lock.
Contoh :
lock
tables account write;
select balance from account where number
= 2; update account set balance = 1500 where number = 2; unlock tables;
Lakukan operasi manipulasi melalui terminal lain atau
komputer lain.
Sebelum ada perintah unlock diberikan
user/program lain tidak dapat melakukan pengubahan pada tabel account.
A. Protokol Transaksi Konkuren
Ketika
multiple user mengakses multiple objek basis data yang berada pada multiple
site di sistem basis data terdistribusi, maka permasalahan kontrol konkurensi
akan terjadi.Konflik terjadi apabila sekumpulan read dari satu transaksi
berpotongan dengan sekumpulan read dari transaksi lainnya, dan/atau sekumpulan
write dari satu transaksi berpotongan dengan sekumpulan write dari transaksi
lainnya. Transaksi T1 dan T2 dikatakan konflik jika kedua-duanya dieksekusi
pada waktu yang bersamaan. Bila T1 telah selesai sebelum T2 dikirim ke sistem,
dalam kasus ini sekumpulan read dan write saling memotong, tidak dianggap konflik.
Konflik diperhatikan pada sekumpulan write yang saling memotong di antara dua
transaksi.
Ada tiga pendekatan secara umum untuk mendesain algoritma kontrol
konkurensi:
1.
Wait. Jika dua
transaksi konflik, transaksi yang konflik harus menunggu sampai transaksi
lainnya selesai.
2.
Timestamp. Urutan eksekusi
transaksi berdasarkan timestamp. Setiap transaksi memiliki timestamp yang unik
dan dua transaksi yang konflik diselesaikan berdasarkan urutan timestamp.
Timestamp dapat diletakkan di awal, tengah, atau akhir eksekusi. Pendekatan
berdasarkan version digunakan untuk menentukan timestamp objek basis data.
3.
Rollback. Dua transaksi
yang konflik, salah satu transaksinya diulang kembali pengerjaannya. Disebut
juga optimistic, karena bila terjadi konflik maka beberapa transaksi akan
di-rollback. Algoritma berdasarkan Mekanisme Wait
Sistem akan melakukan lock pada entitas basis data. Ada dua tipe
lock:
1.
Readlock. Transaksi akan
mengunci entitas pada mode shared. Sehingga transaksi lain yang menunggu untuk
membaca beberapa entitas juga bisa mendapatkan readlock.
2.
Writelock. Transaksi akan
mengunci entitas pada mode eksklusif. Jika ada satu transaksi akan melakukan
penulisan pada entitas yang telah di-writelock, maka transaksi lainnya tidak
boleh mendapatkan readlock maupun writelock pada entitas ini.
Lock akan menimbulkan masalah baru.
Livelock dan deadlock. Livelock terjadi ketika suatu transaksi berkali-kali
gagal dalam mendapatkan lock. Deadlock terjadi ketika beberapa transaksi
melakukan lock pada beberapa entitas pada saat yang bersamaan; setiap transaksi
mendapatkan lock dari entitas yang berbeda dan saling menunggu transaksi
lainnya untuk melepaskan lock.
Deadlock dapat diatasi dengan:
Deadlock
ini sangat jarang terjadi, sehingga akan lebih efektif ditanggulangi
ketika telah terjadi daripadamelakukantindakan preventif dari awal yang memakan
biaya lebih besar.Protokol sederhana yang diperlukan, sehingga setiap transaksi
dapat memenuhi aturan keberlanjutan adalah two-phase locking (2PL).
1.
Fase
locking.
Transaksi mengambil lock tanpa melepasnya.
2.
Fase
unlocking.
Dalam fase ini, transaksi melepaskan lock yang ada dan tidak boleh mengambil
lock.lockpoint merupakan keadaan sesaat sebelum pelepasan lock yang pertama
kali dilakukan. Algoritma berdasarkan Mekanisme Timestamp .Untuk mendapatkan
timestamp unik untuk transaksi pada node berbeda di sistem terdistribusi, clock
setiap node harus disamakan. Untuk menyelaraskan clock dapat digunakan message
passing. Algoritma berdasarkan Mekanisme Rollback/Optimistic.
Terdapat 4 fase eksekusi transaksi pada pendekatan kontrol
konkurensi optimistic:
1.
Read. Proses membaca
tidak terlalu dibatasi. Hasilnya diletakkan pada variabel lokal. Sekumpulan
read tergantung juga pada proses validasi.
2.
Compute. Transaksi
menghitung sekumpulan nilai dari data entitas yang disebut sekumpulan write.
Hasilnya diletakkan pada variabel lokal.
3.
Validate. Sekumpulan write
dan read transaksi lokal divalidasi oleh sekumpulan transaksi yang sedang
berjalan.
4.
Commit
and Write.
Setelah berhasil divalidasi, akan dijalankan di sistem dan diberikan timestamp.
Sekumpulan write akan diubah menjadi variabel global dan nilainya dikirim ke
setiap node. Jika tidak berhasil divalidasi, transaksi diulangi lagi dari fase
compute atau read. Evaluasi Performansi dari Algoritma Kontrol Konkurensi
Kontrol Konkurensi yang dapat Disesuaikan
Sistem basis data yang ada, saling terhubung dengan sistem basis
data terdistribusi yang heterogen. Penggunaan konsep sistem basis data
Reliable, Adaptable, Interoperable, Distributed (RAID), menjadi fasilitas dalam
metode kontrol konkurensi. Model umum untuk pendekatan terhadap sistem dan
transaksi yang berbeda adalah dengan generic state, converting state, dan
suffix sufficient state.
Kesimpulan :
Kontrol konkurensi adalah masalah yang timbul ketika beberapa proses
terjadi pada berbagai tempat di sistem. Solusi awal untuk hal ini adalah dengan
memastikan kelas-kelas serializability, two-phase locking, dan formalisasi
pendekatan optimistic. Mekanisme populer untuk kontrol konkurensi adalah
two-phase locking. Kontrol konkurensi yang dapat disesuaikan diimplementasikan
pada sistem RAID. Penelitian diharapkan berlanjut, pada bidang semantik dari
transaksi dan terutama pada sistem yang berorientasi objek. Pada sistem
berskala besar, sangat sulit untuk mem-blok akses ke objek basis data untuk
melakukan transaksi. Locking pada masa yang akan datang tidak akan relevan lagi
pada kasus seperti ini.
B. Recoverability
Recovery dari
kegagalan transaksi artinya database dikembalikan ke kondisi yang
terdahulu,mendekati waktu terjadinya kegagalan.Untuk melakukan hal tersebut, perlu disimpan
informasi mengenai perubahan terhadap data selama pelaksanaan transaksi di luar
database. Informasi tersebut disebut sebagai sistem log.
Teknik recovery berhubungan erat dengan mekanisme kontrol konkurensi
yang digunakan pada sistem bersangkutan. Sistem Basis Data harus melaksanakan
tindakan tertentu untuk menjamin sifat transaksi yang Atomik dan Durable.
Bagian terintegrasi dari sebuah Sistem Basis Data adalah sebuah
skema recovery yang dapat memulihkan Basis Data kepada keadaan konsisten
sebelum kegagalan sistem.
Kegagalan sistem saat
melakukan transaksi merupakan hal yang harus diperhatikan secara seksama karena
terkait dengan 4 sifat yang harus dimiliki oleh suatu transaksi, ACID (Atomicity,
Consistency, Isolation, dan Durability), Recovery merupakan solusi dari hampir
semua fitur ACID yang harus dimiliki oleh setiap transaksi.Oleh karena itu, transaksi tidak hanya disebut sebagai suatu unit
pekerjaan, namun juga sebagai suatu unit recovery.
Pada DBMS modern, konsep recovery sangat penting, bahkan konsep
Backup pada DBMS modern tidak akan dapat dimengerti sepenuhnya tanpa
pengetahuan yang cukup mengenai konsep recovery. Hampir seluruh DBMS modern
menggunakan konsep recovery berbasis Log.
C.
Testing For Serializability
Serializability 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). Serializable berarti jika
jadual (nonserial) menghasilkan hasil yg sama seperti halnya jadual serial
lainnya. Pada saat mendesain skema kontrol konkurensi, kita harus tunjukan
bahwa jadwal yang dibuat oleh skema tersebut adalah serializable. Terdapat
metode simpel dan efisien untuk menentukan conflict serializability dari suatu
jadwal. Misalkan sebuah jadwal S. Kita dapat membuat suatu grafik langsung
yang diberi nama grafik preseden (presedence graph).
Grafik preseden terdiri dari sepasang G = (V,E), dimana V adalah
serangkaian simpul dan E adalah serangkaian tepian / busur. Serangkaian
simpul terdiri dari semua transaksi yang berperan serta di dalam penjadwalan.
Serangkaian tepian / busur terdiri dari semua bentuk Ti -> Tj untuk masing –
masing dari ketiga kondisi berikut :
• Ti eksekusi write(Q) sebelum Tj
eksekusi read(Q)
• Ti eksekusi read(Q) sebelum Tj eksekusi write(Q)
• Ti eksekusi write(Q) sebelum Tj eksekusi write(Q)
Jika bentuk Ti -> Tj ada di dalam grafik preseden, maka di setiap
jadwal S’ serial yang ekivalen ke jadwal S, Ti harus muncul sebelum Tj.
KESIMPULAN
Transaksi adalah sebuah
unit dari eksekusi program yang mampu mengakses dan mengupdate berbagai data
yang memiliki kaitan logika transaksi itu sendiri dimana dalam menjaga
konsitensi data secara terintegrasi dipertahankan.
Sebuah transaksi
harus memiliki sifat –ACID : Atomik, Consisten, Isolasi, Durability.