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.
- 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 SQL
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
|
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.
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
|
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
|
Kemudian data dalam jendela 2 muncul
|
|
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
|