{Transaksi}
Apa itu transaksi?
"A transaction
is a logical, atomic unit of work that contains one or more SQL statements. A
transaction groups SQL statements so that they are either all committed,
which means they are applied to the database, or all rolled
back, which means they are undone from the database. Oracle Database
assigns every transaction a unique identifier called a transaction ID." -docs.oracle.com
Transaksi pada basis data adalah satu atomic operasi berupa lojik
pekerjaan maupun lojik recovery yang bisa terdiri dari beberapa intruksi.
Transaksi dalam basis data adalah
program atau bagian yang didalam pelaksanannya akan mengakses atau mengubah
basis data yang terdapat di database. Setiap transaksi harus menunjukan
konsistensi basisdata. Pada saat awal dan akhir program harus tetap
konsisten,maka pada saat proses basisdata akan tetap dalam keadaan konsisten.
Transaksi yang berlangsung
tersebut, hanya mengenal dua hasil yaitu hasil secara keseluruhan atau gagal
sama sekali. Transaksi tersebut berarti tidak boleh berhasil setengah-setengah,
tetapi harus berhasil secara keseluruhan.
Tujuan Transaksi Untuk Apa Sih?
Melindungi
database dari kehilangan data dan kerusakan.
Bagaimana Contoh Masalahnya?
- Sistem crash di tengah eksekusi program yang membuat database dalam state yang tidak diketahui
- Dua program yang mengakses data yang sama dijalankan bersamaan sehingga saling menggangu.
Empat Sifat Dalam Transaksi
- Atomicity
Ini berarti transaksi harus berhasil secara keseluruhan atau gagal sama sekali - Consistency
Menjaga kekonsistenan data di database - Isolation
Transaksi yang dimulai secara bersamaan harus bisa dimulai dan bisa berakhir - Durability
Setelah transaksi berhasil, data tidak boleh kembali ke data awal walaupun sistem mati
{Commit dan Rollback dalam Oracle}
Commit
Adalah perintah yang berfungsi untuk mengendalikan
pengeksekusian transaksi yang menyetujui rangkaian perintah yang berhubungan
erat dengan perintah yang sebelumnya telah berhasil dilakukan.
Rollback
Adalah perintah yang berfungsi untuk mengendalikan
pengeksekusian transaksi yang membatalkan transaksi yang dilakukan karena
adanya kesalahan atau kegagalan pada salah satu rangkaian perintah.
SYNTAX SQLNYA DALAM ORACLE
COMMIT;
|
Adalah perintah
yang berfungsi untuk mengendalikan pengeksekusian transaksi yang
menyetujui rangkaian perintah yang berhubungan erat dengan perintah yang sebelumnya
telah berhasil dilakukan.
|
SAVEPOINT [nama
save point];
|
Savepoint adalah batu loncatan untuk transaksi
dimana kondisi database dapat dikembalikan keposisi saat savepoint dibuat.
Semua perubahan yang melewati savepoint tersebut akan dibuat permanen.
|
ROLLBACK TO [nama save point];
|
Adalah perintah
yang berfungsi untuk mengendalikan pengeksekusian transaksi yang
membatalkan transaksi yang dilakukan karena adanya kesalahan atau kegagalan
pada salah satu rangkaian perintah
|
Contoh
Agar terlihat bagaimana commit kita membutuhkan dua jendela dalam SQL
command
Tampilan SQL command
dalam Oracle
Bagaimana contoh lengkapnya dalam pemrograman?
- Persiapkan SQL Command lalu buat perintah dalam jendela 1
- Kita akan membuat database dalam oracle terlebih dahulu, misalnya database latihan
- Lalu Membuat Tabel dan isi tabelnya dengan syntax
CREATE TABLE COBA(
ID_COBA NUMBER PRIMARY KEY,
NAMA VARCHAR2(20) NOT NULL
);
CREATE SEQUENCE SEQ_IDCOBA INCREMENT BY 1;
INSERT INTO COBA VALUES(SEQ_IDCOBA.NEXTVAL,'A');
INSERT INTO COBA VALUES(SEQ_IDCOBA.NEXTVAL,'B');
INSERT INTO COBA VALUES(SEQ_IDCOBA.NEXTVAL,'C');
INSERT INTO COBA VALUES(SEQ_IDCOBA.NEXTVAL,'D');
INSERT INTO COBA VALUES(SEQ_IDCOBA.NEXTVAL,'E');
ID_COBA NUMBER PRIMARY KEY,
NAMA VARCHAR2(20) NOT NULL
);
CREATE SEQUENCE SEQ_IDCOBA INCREMENT BY 1;
INSERT INTO COBA VALUES(SEQ_IDCOBA.NEXTVAL,'A');
INSERT INTO COBA VALUES(SEQ_IDCOBA.NEXTVAL,'B');
INSERT INTO COBA VALUES(SEQ_IDCOBA.NEXTVAL,'C');
INSERT INTO COBA VALUES(SEQ_IDCOBA.NEXTVAL,'D');
INSERT INTO COBA VALUES(SEQ_IDCOBA.NEXTVAL,'E');
Selanjutnya melihat isi tabel dengan syntax dibawah baik di jendela 1 ataupun jendela 2
Syntax dalam Jendela 1
|
Syntax dalam Jendela 2
|
|
SQL> select * from coba;
ID_COBA NAMA
---------- --------------------
1 A
2 B
3 C
4 D
5 E
|
SQL> select * from coba;
no rows selected
|
|
*Kenapa dalam Jendela 2 tidak ada isi dari
data,padahal terkoneksi dalam database dan tabel yang sama? Alasannya karena
kita belum melakukan commit
terlebih dahulu sehingga data yang ada tidak berlaku secara umum, hal yang
harus dilakukan agar data dalam jendela 2 muncul adalah dengan melakukan commit di jendela 1 tempat kita membuat
data awal
|
||
SQL> commit;
Commit complete.
|
SQL> select * from coba;
ID_COBA NAMA
---------- --------------------
1 A
2 B
3 C
4 D
5 E
|
|
*Taraaa! Data dalam jendela 2 muncul, sekarang kita akan coba membuat
savepoint
|
||
savepoint TRANSAKSI;
INSERT INTO COBA
VALUES(SEQ_IDCOBA.NEXTVAL,'F');
UPDATE COBA SET NAMA='B' WHERE
ID_COBA=1;
SQL> savepoint TRANSAKSI;
Savepoint created.
SQL> select * from coba;
ID_COBA NAMA
---------- --------------------
1 B
2 B
3 C
4 D
5 E
6 F
|
(Data
akan sama seperti data awal kecuali kita melakukan commit lagi)
|
|
*Sebelum melakukan savepoint kita akan merubah sedikit datanya agar
terlihat perbedaan dengan data sebelumnya,lalu di Jendela 1 Kita akan membuat
savepoint bernama TRANSAKSI
|
||
SQL> rollback to TRANSAKSI;
Rollback complete.
SQL> select * from coba;
ID_COBA NAMA
---------- --------------------
1 A
2 B
3 C
4 D
5 E
|
(Data
akan sama seperti data awal kecuali kita melakukan commit lagi)
|
|
*Untuk kembali ke data awal kita cukup menggunakan ROLLBACK , cukup
panggil rollback (nama savepoint-nya) sehingga data akan kembali ke awal kita
membuat savepoint
|
||
3 Fenomena Yang Harus Dicegah dalam Transaksi
Ada fenomena – fenomena
tertentu yang harus di cegah selama eksekusi transaksi, yaitu :
- Dirty Reads : Sebuah transaksi membaca data yang telah di tulis oleh transaksi yang lain tetapi belum di commit oleh transaksi lain tersebut.
- Non Repeatable Reads : Sebuah transaksi yang membaca kembali sebuah data dimana data tersebut sudah di rubah / di hapus oleh transaksi lain dan telah di commit.
- Sebuah transaksi menjalankan kembali sebuah query dimana akan menemukan bahwa ada transaksi lain yang telah memasukkan record baru ke schema yang sedang di akses oleh transaksi tersebut, sehingga akan terlihat antara query yang pertama di lakukan dengan query yang kedua memberikan hasil eksekusi jumlah row yang berbeda
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.
{Locking Protocol}
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.
- Exclusive Lock (X-LOCK)
Bagi
transaksi yang memiliki exclusive lock pada suatu data, transaksi tersebut
dapat melakukan perubahan dan pembacaan terhadap data tersebut.
Untuk shared
lock, dapat dimiliki oleh beberapa transaksi dalam satu waktu, namun untuk
exclusive lock, hanya dapat dimiliki oleh satu transaksi pada satu waktu.
{Deadlock}
Deadlock
adalah suatu kondisi dimana dua proses atau lebih saling menunggu proses yang
lain untuk melepaskan resource yang sedang dipakai. Karena beberapa proses itu
saling menunggu, maka tidak terjadi kemajuan dalam kerja proses‐proses
tersebut. Deadlock adalah masalah yang biasa terjadi ketika banyak proses yang
membagi sebuah resource yang hanya boleh dirubah oleh satu proses saja dalam
satu waktu. Di kehidupan nyata, deadlock dapat digambarkan dalam gambar
berikut.Pada gambar diatas, deadlock dianalogikan sebagai dua antrian mobil
yang akan menyeberangi jembatan. Dalam kasus diatas, antrian di sebelah kiri
menunggu antrian kanan untuk mengosongkan jembatan (resource), begitu juga
dengan antrian kanan. Akhirnya tidak terjadi kemajuan dalam kerja dua antrian
tersebut.Misal ada proses A mempunyai resource X, proses B mempunyai resource
Y. Kemudian kedua proses ini dijalankan bersama, proses A memerlukan resource Y
dan proses B memerlukan resource X, tetapi kedua proses tidak akan memberikan
resource yang dimiliki sebelum proses dirinya sendiri selesai dilakukan.
Sehingga akan terjadi tunggu‐menunggu.
0 comments: