Minggu, 09 Januari 2011

Monitoring and Resolving Lock Conflicts

Locks
Istilah lock pada database berarti suatu kunci atau penguncian. Lock digunakan pada saat terjadi pengaksesan database oleh user secara bersamaan. Hal ini ditujukan untuk menjaga data agar tidak corrupt / hilang atau data yang tidak valid pada saat banyak user mengakses database secara bersamaan / konkuren.    Sebelum database mengijinkan suatu sesi user untuk memodifikasi data, pertama-tama sesi me-lock data yang akan dimodifikasi. Lock memberikan exclusive control terhadap suatu data pada sebuah sesi sehingga tidak akan ada transaksi lain yang dapat memodifikasi data yang ter-lock sampai lock terhadap data tersebut telah di lepas. Transaksi dapat melakukan lock
Ø  pada sebuah row data dari suatu tabel,
Ø  multiple row data dari suatu tabel, atau
Ø  satu tabel itu sendiri yang di lock.
 Oracle 10g memiliki mekanisme lock secara manual dan otomatis.
Ada  dua mekanisme untuk melakukan locking data pada database yaitu :
1.     Pessimistic Locking
Proses locking yang terjadi pada saat lock di request maka record atau table akan di lock secara immediate / langsung.
2.     Optimistic Locking
Proses locking yang terjadi pada saat suatu record / data pada database dilakukan suatu perubahan / update.







Locking Mechanism

            Locking mekanisme di disain untuk menyediakan derajat konkurensi yang tinggi yang terjadi pada database. Suatu transaksi yang memodifikasi data memperoleh row-level locks daripada table-level locks. Proses query pada suatu data tidak membutuhkan mekanisme lock terhadap data yang di query, sebuah query tetap berhasil dieksekusi pada suatu data atu tabel walaupun  ada user yang member lock pada stuatu data atau tabel. Pada saat multiple transaksi membutuhkan suatu lock pada resource yang sama, transaksi yang pertama meminta lock pada suatu resource tersebut. Transaksi yang lainnya berada pada fase menunggu di antrian sampai transaksi yang pertama telah selesai mengeksekusi resource. Mekanisme antrian ini bersifat otomatis dan tidak membutuhkan interaksi dari suatu administrator atau user yang lain.
            Semua lock di lepas pada saat transaksi berakhir. Transaksi dikatakan selesai / complete apabila perintah commit atau rollback dilaksanakan. Pada kasus transaksi yang failed, baground proses secara otomatis melakukan rollback kegagalan yang terjadi dengan merubah transaksi yang gagal tersebut menjadi ke posisi save point atau sebelum proses transaksi gagal.

Data Concurrency

            Mekanisme lock secara default berada pada row-level locking mode. Transaksi yang berbeda dapat mengupdate row data yang berbeda yang berada pada sebuah tabel yang sama tanpa bertentangan antara yang satu dengan yang lain. Sementara default model lock berapada pada row-level, Oracle Database 10g mensupport manual locking konfigurasi pada level yang lebih tinggi. Berikut contoh locking suatu tabel

Text Box: SQL >  LOCK TABLE karyawan IN EXCLUSIVE MODE;     

Dengan statement diatas, transaksi yang lain yang mencoba untuk meng-update data pada tabel yang sudah di lock ( karyawan ) harus menunggu pada antrian sampai transaksi yang mempunyai lock pada tabel tersebut telah selesai ( commit ).



Sesi 1 : locking table karyawan in exclusive mode

Sesi 2 : waiting to update table karyawan.



Sesi 1 : commit ( transaksi telah berakhir dan locking terhadap tabel karyawan di release )

Sesi 2 : traksaksi update success

EXCLUSIVE lock adalah lock yang paling tinggi derajatnya. Berikut ini beberapa lock mode yang ada pada Oracle :

1.     ROW SHARE
Mengijinkan konkuren akses / akses secara bersama-sama pada tabel yang di lock, tetapi user yang lain tidak dapat member lock exclusive pada tabel yang diberi share lock sampai share lock di lepas. user yang tidak melakukan lock pada tabel, masih dapat mengakses data.

2.     ROW EXCLUSIVE
Sama dengan ROW SHARE, tetapi tidak diperbolehkan user lain untuk memberi SHARE mode sebelum lock sudah di lepas.Terjadi secara otomatis pada saat terjadi updating, inserting, atau deleting suatu data.

3.     SHARE
Mengijinkan proses query yang konkuren / bersama-sama tetapi tidak diperbolehkan untuk mengubah mode lock tabel. SHARE lock dibutuhkan ( dan secara otomatis diminta ) untuk membuat index pada tabel.

4.     SHARE ROW EXCLUSIVE
Digunakan untuk melakukan query pada keseluruhan data pada tabel dan memberi akses kepada sesi user lain untuk melakukan query pada tabel tetapi tidak diperbolehkan sesi user yang lain untuk memberi lock pada tabel serta tidak diperbolehkan untuk mengupdate data pada tabel.

5.     EXCLUSIVE
Mengijinkan sesi user yang lain untuk melakukan query pada tabel yang di lock tetapi tidak diperbolehkan melakukan suatu aktivitas yang lain selain query pada tabel tersebut. Exclusive lock dibutuhkan pada saat proses drop suatu tabel.
Seperti beberapa permintaan untuk lock, eksekusi statement lock secara manual terdapat antrian sampai sesi statement yang lain telah memiliki lock, atau telah melepas lock. perintah LOCK dapat menerima special argument untuk mengontrol proses menunggu yaitu menggunakan NOWAIT.


NOWAIT mengembalikan control kepada sesi yang meminta lock secara langsung jika tabel yang ingin di lock telah di lock oleh sesi user yang lain.
Text Box: SQL >  LOCK TABLE nama_tabel IN mode_lock NOWAIT;

Sesi 1 melakukan lock tabel karyawan pada mode row share

Sesi 2 ingin melakukan lock pada tabel karyawan tetapi di tolak



DML Locks

            Setiap transaksi DML terdapat 2 lock :
1.     Row exclusive lock pada sebuah data atau banyak data yang sedang di update.
Hal ini akan menjadi row exclusive lock berdasarkan pada jumlah data yang diupdate.
2.     Shared table level lock pada tabel yang sedang di update.
Hal ini mencegah sesi user lain untuk melakukan lock keseluruhan tabel ( kemungkinannya untuk drop tabel atau truncate data tabel ) sementara perubahan sedang terjadi.
Enqueue Mechanism ( mekanisme antrian )

            Permintaan suatu lock secara otomatis akan di masukkan ke dalam antrian. Setelah suatu transaksi yang memegang lock telah selesai, maka sesi berikutnya yang telah mengantri terlebih dahulu akan mendapatkan lock. suatu sesi yang sedang memegang lock pada suatu data atau tabel dapat me-request untuk mengubah mode lock yang sedang terjadi tanpa harus melepas sesi lock dan kembali ke antrian. Sebagai contohnya, misalkan terdapat sebuah sesi yang memegang mode shared lock pada suatu tabel. Sesi tersebut dapat merubah dari shared lock ke exclusive lock, selama tidak ada sesi lain yang sedang memiliki exclusive lock atau share lock pada tabel tersebut. Maka sesi yang memegang shared lock akan di beri grant / hak akses untuk mendapatkan exclusive lock tanpa harus menunggu di antrian terlebih dahulu.



Lock Conflicts

            Konflik pada suatu transaksi database sering terjadi, tetapi pada umumnya dapat di selesaikan berdasarkan periode waktu dan mekanisme antrian. Ada suatu kasus yang sangat jarang terjadi lock konflik dibutuhkan konfigurasi dari administrator untuk menyelesaikan konflik. Berikut contoh konflik yang jarang terjadi :

Transaction 1
Time
Transaction 2
UPDATE hr.employees SET salary=salary+100 WHERE employee_id=100;
1 row updated.
9:00:00
UPDATE hr.employees SET salary=salary+100 WHERE employee_id=101;
1 row updated.
UPDATE hr.employees SET COMMISION_PCT=2 WHERE employee_id=101;
Sesi menunggu karena terjadi lock konflik.
9:00:05
SELECT sum(salary) FROM hr.employees;
SUM(SALARY)
---------------------
895463
Sesi masih menunggu di antrian!!
16:30:00
Terjadi transaksi yang banyak dalam waktu 7.5 jam, tetapi belum ada commit atau rollback
1 row updated.
16:30:01
Commit;

pada kasus diatas, transaksi 2 mendapatkan lock single row pada jam 9:00:00 dan tidak melakukan commit. Di sisi lain transaksi 1 menunggu untuk proses update pada tabel, tetapi transaksi 2 pada saat itu membutuhkan lock pada semua data. Sehingga transaksi 1 di block oleh transaksi 2 sampai transaksi 2 commit pada jam 16:30:01. Untuk hal ini user yang mengeksekusi transaksi 1 menghubungi administrator untuk mengatasi permasalahan ini.

Detecting Lock Conflicts

Pada oracle 10g untuk mendeteksi lock konflik kita dapat menggunakan Enterprise Manager. Berikut langkah-langkah mendeteksi lock. Misal sebelumnya sudah ada transaksi berikut :
Sesi 1 lock tabel karyawan

Sesi 2 update tabel karyawan


Sesi 3 insert tabel karyawan


1.     Pada Enterprise Manager buka halaman Performance
2.     Klik Blocking pada bagian kiri bawah halaman.

3.     Halaman Blocking Sessions muncul. Terdapat tiga sesi user yang sedang mengalami konflik.


Resolving Lock Conflicts

            Untuk menyelesaikan lock konflik, suatu sesi yang memegang lock harus di lepaskan. Ada beberapa cara untuk menyelesaikan masalah lock konflik, cara yang paling baik ialah dengan cara member tahu si user yang sedang memanipulasi data untuk melakukan commit atau rollback terhadap transaksi yang sedang dijalankan. Jika terjadi suatu keadaan yang mendesak, penyelesaian lock konflik memungkinkan administrator untuk men-terminasi sesi user yang sedang memegang lock dengan cara meng-klik tombol Kill Session. Saat suatu sesi di terminate / di stop, semua transaksi yang sedang terjadi pada sesi akan di rollback. User yang sesinya di terminate harus login terlebih dahulu untuk melakukan transaksi yang telah di terminate.
Berikut langkah-langkah untuk men-terminate sesi user :

4.     pada halaman Blocking Sessions, pilih sesi user yang akan di terminate. Kemudian klik Kill Session.
5.     Pesan konfirmasi muncul, pilih kill Immediete. Kemudian klik Yes.


6.     Pada sisi user yang di-terminate akan muncul pesan your session has been killed dan transaksi secara otomatis mengalami rollback.
Deadlocks
Deadlock merupakan contoh lock konflik yang sangat special. Deadlock terjadi pada saat terdapat dua atau lebih sesi yang sedang saling menunggu antar satu sama lain untuk mendapatkan hak atas lock. dikarenakan sesi antar satu dengan yang lain saling menunggu dan tidak dapat menyelesaikan transaksi masing-masing maka akan terdeteksi sebagai deadlock.

Transaksi 1
Time
Transaksi 2
UPDATE karyawan
SET nama = ‘paijo’
WHERE employee_id = 400;
9:00
UPDATE karyawan
SET nama = ‘paimin’
WHERE employee_id = 300;
UPDATE karyawan
SET nama = ‘paul’
WHERE employee_id = 300;
9:15
UPDATE karyawan
SET nama = ‘gilbert’
WHERE employee_id = 400;

Oracle secara otomatis mendeteksi dan menyelesaikan deadlock dengan cara me-rollback semua transaksi yang sedang mengalami deadlock

2 komentar:

  1. Make money with a gambling machine to make money? - Work
    How to play casino games is a lot of หาเงินออนไลน์ fun. to make money with a casino slot machine machine for your personal

    BalasHapus