Integritas Data dan Transaksi – Concurrency

Pendahuluan

Sistem basis data merupakan sekumpulan basis data dengan para pemakai, perancang dan pengelola basis data, serta sistem yang mendukungnya secara bersama-sama. Ada beberapa poin penting yang mendukung berjalannya sebuah sistem basis data diantaranya adalah integritas data (data integrity), transaksi (transaction), konkurensi (concurrency), back-end programming dan keamanan data (security) serta perangkat dan bahasa yang mendukung untuk transfer data seperti XML.

 

Integritas Data

Integritas data artinya akurasi dan kebenaran data. Integritas data dalam sebuah sistem basis data harus dijaga untuk menjaga kebenaran data yang disimpan. Ada beberapa cara dan tujuan dalam menjaga integritas data, diantaranya :

  • Memasukkan aturan bisnis di dalam database
  • Menjaga agar data yang tidak valid tidak masuk ke database
  • Menjaga konsistensi data pada relasi keterkaitan antar tabel

Mengapa harus menangani integritas data pada level database programming ? Karena :

  • Menangani integritas data pada level database lebih murah dan mudah dibandingkan dengan menanganinya di level aplikasi
  • Bugs akibat data yang tidak valid pada database tidak mudah ditemukan dan dapat muncul di kemudian hari
  • Ketahanan database akan lebih kuat untuk jangka panjang jika ditangani dengan benar

Berikut ini adalah jenis-jenis integritas data yang disertai dengan contoh kasusnya :

  • Create Domain,  yaitu membuat tipe data baru. Fungsi ini biasa digunakan untuk menangani data yang membutuhkan aturan bisnis sendiri,
    • Contohnya : membuat tipe data “gender” untuk yang isinya hanya boleh berisi pria atau wanita ->
    • Maka sintaksnya dalam SQL adalah :
      create domain gender char(2) constraint gender_domain check ( value in(‘pria’,’wanita’));
  • Not NULL, yaitu menjaga agar suatu data tidak kosong dengan kata lain harus ada value-nya.
    • Contohnya nama matakuliah pada tabel mata kuliah tidak boleh kosong.
    • Maka sintaksnya dalam pl / sql :
    • nama_matkul varchar2(15),
    • constraint nn_ matkul not null (nama_matkul)
  • Unique, yaitu membuat agar suatu data tidak memiliki nilai yang sama dengan record lainnya dalam tabel yang sama.
    • Contohnya email pada tabel akun_facebook hanya boleh satu email untuk satu akun.
    • Sintaksnya :
    • email varchar2(15),
    • constraint u_mail unique (email)
  • Primary key, merupakan gabungan antara not null dan unique.
    • Misalnya NIM pada tabel mahasiswa.
    • nim char(7) not null,
    • constraint pk_ nim primary key (nim)
  • Check, memeriksa data dengan aturan bisnisinya sendiri tanpa membuat tipe data baru.
    • Contohnya sebelum memasukkan nilai ujian pada tabel nilai, data diperiksa terlebih dahulu. Data tidak boleh masuk jika bernilai negatif.
    • nilai number,
    • constraint chk_nilai check (nilai > 0)
  • Referential Integrity, adalah integritas pada relasi antar tabel. Contohnya jika kolom NIM mahasiswa pada tabel nilai mengacu ke kolom NIM pada tabel mahasiswa, dan terjadi perubahan (delete atau update) pada NIM di tabel mahasiswa, maka ada beberapa pilihan yang dapat dilakukan terhadap NIM yang di tabel nilai, diantaranya adalah :
    • Delete cascade, hapus record pada kedua tabel yang bersangkutan
    • Delete set null, hapus record di tabel asal dan value record pada tabel yang mengacu di jadikan NULL
    • Update cascade, perbarui isi record pada kedua tabel
    • nim char(7),
    • constraint fk_nim foreign key (nim) references mahasiswa (nim) on delete cascade / on delete set   null /  on update cascade 
 

Transaksi dan Concurrency

Transaksi pada basis data adalah satu atomic operasi berupa lojik pekerjaan maupun lojik recovery (pemulihan) yang bisa terdiri dari beberapa intruksi. Tujuan dari transaksi adalah menjaga database dari kehilangan data dan kerusakan, seperti system crash dan pengaksesan data yang sama secara bersamaan oleh dua aplikasi yang berbeda yang menimbulkan gangguan.

Ada empat elemen dalam transaksi yang biasa disingkat ACID, yaitu :

  • Atomicity,  semua berhasil atau semua gagal
  • Consistency,  transaksi mempertahankan konsistensi database
  • Isolation,  transaksi terisolasi satu dengan yang lain
  • Durability,  setelah commit update harus survive di database

Dan ada dua jenis transaksi yang paling penting dalam sistem basis data adalah :

  • Commit, memberi tanda bahwa transaksi telah selesai. Update dibuat permanen (bahkan jika setelah commit terjadi kegagalan system). Pada implementasinya, contohnya di konsol SQL command, setelah proses transaksi selesai untuk commit tinggal ketikkan -> commit;
  • Rollback, memberi tanda bahwa transaksi gagal. Semua update harus di-undo. Pada implementasinya, contohnya di konsol SQL command, setelah proses transaksi selesai untuk membatalkan transaksi tadi tinggal ketikkan -> rollback;

Untuk lojik recovery atau system recovery database dilakukan ketika terjadi kegagalan media, kegagalan system atau kesalahan pada transaksi. Sistem recovery menggunakan fungsi rollback dan checkpoint. Checkpoint adalah interval tertentu pada perjalanan transaksi basis data yang menyimpan keadaan basis data saat itu. Checkpoint dapat dilakukan untuk me-recovery database secara backward (undo) maupun forward (redo).

Sedangkan concurrency adalah sebuah mekanisme pada system basis data yang mengijinkan banyak transaksi pada saat bersamaan untuk mengakses data yang sama tanpa adanya gangguan. Pada umumnya terdapat 3 masalah utama pada concurrency :

  • Lost update problem, ketika dua user mengupdate dua buah data yang sama
    • Contoh :
Satuan Waktu Transaksi A Transaksi B
1 Retrieve r
2 Retrieve r
3 Update r
4 Update r
    • Dari contoh diatas, maka transaksi A tidak akan dianggap dan data update pada transaksi A akan di overwrite oleh transaksi B Ini akan menimbulkan lost update problem pada transaksi A.
  • Uncommited dependency problem, ketika user yang satu me-retrieve data dan user yang lain me-rollback data tersebut
    • Contoh :
Satuan Waktu Transaksi A Transaksi B
1 Update r
2 Update r
3 Rollback
    • Dari contoh diatas, maka transaksi A akan menerima data yang salah karena pada transaksi B saat di update terjadi kesalahan kemudian di rollback.
  • Inconsistent analysis problem, ketika user yang satu meretrieve data dan user yang lain mengupdate data tersebut
    • Contoh :
Satuan Waktu Transaksi A Transaksi B
1 Retrieve r1
2 Retrieve r2
3 Update r1
4 Commit
5 Update r3 = r1 + r2  
    • Dari contoh diatas, maka transaksi A akan menghasilkan data yang salah dan tidak sesuai database karena saat analisis di transaksi A terjadi update data pada salah satu datanya.

Untuk menangani masalah-masalah tersebut, dilakukan proses locking, jika sebuah transaksi ingin record/resource tidak berubah dalam waktu tertentu maka dia bisa meminta lock. Ada dua jenis lock yaitu :

  • Exclusive Lock (Xlock) -> write lock
  • Shared Lock (Slock) -> read lock

Bagaimana cara kerjanya?

  • Jika transaksi A memegang Xlock pada sebuah record, maka permintaan lock (X,S) pada record yang sama harus diabaikan.
  • Jika transaksi A memegang Slock pada record R maka :
    • Permintaan Xlock transaksi lain pada R ditolak
    • Permintaan Slock transaksi lain pada R diterima

Tapi, ada satu masalah yang dapat terjadi ketika melakukan proses locking ini, yaitu deadlock. Yaitu, situasi dimana dua atau lebih transaksi dalam kondisi wait-state, satu sama lain menunggu lock dilepaskan sebelum dapat memulai. Cara penanganannya adalah :

  • Deteksi dan pecahkan deadlock
  • Deteksi deadlock -> wait-for-graph
  • Pecahkan deadlock -> salah satu dirollback paksa
  • Ostrich Algorithm  -> diabaikan
 

Referensi

cs.upi.edu

elearning.cs.upi.edu

Leave a comment