Senin, 21 April 2014

Transaksi



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.
  1. Atomicity
    Ini berarti transaksi harus berhasil secara keseluruhan atau gagal sama sekali
  2. Consistency
    Menjaga kekonsistenan data di database
  3. Isolation
    Transaksi yang dimulai secara bersamaan harus bisa dimulai dan bisa berakhir
  4. 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 :
  1. Dirty Reads : Sebuah transaksi membaca data yang telah di tulis oleh transaksi yang lain tetapi belum di commit oleh transaksi lain tersebut.
  2. 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.
  3. 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?
  1. Persiapkan SQL Command lalu buat perintah dalam jendela 1
  2. Kita akan membuat database dalam oracle terlebih dahulu, misalnya database latihan
  3. 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');

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

Tidak ada komentar:

Posting Komentar