{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
  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 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?
  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
*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 :
  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.
{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: