Saturday, December 12, 2009

Lock Tables

Lock Tables, sesuai dengan judulnya posting ini tentang teknik penguncian tabel.

Sebuah Database pada suatu kasus bisa saja yang menggunakan tidak hanya satu aplikasi (misalkan aplikasi yang pertama berbentuk webbase, dan aplikasi yang lain berbentuk desktop aplikasi). Dan kedua aplikasi tersebut mengakses tabel yang sama secara bersaman, maka akan mungkin terjadi kesalahan data (misalkan kesalahan tentang stok barang, pada kasus ini aplikasi pertama sedang melakukan proses penambahan stok pada tabel_stok tiba-tiba aplikasi kedua melakukan penghitungan stok pada tabel_stok ketika proses penambahan stok belum selesai) .

Kejadian ini dapat dihindari dengan menerapkan LOCK TABLES.
LOCK TABLES melakukan penguncian tabel [LOCK TABLES] ketika proses sedang berlangsung, kemudian akan membebaskan table [UNLOCK TABLES] ketika proses telah berakhir.


Pada Database MySQL 5.x.x telah tersedia feature Lock Tabels, pada posting ini Locks Tables yang di lakukan adalah penguncing pada level tabel.

Rule Locks Tables yang tersedia ada dua macam :

1. Read Lock, adalah penguncian tabel yang menjadikan tabel tersebut hanya dapat dilakukan manipulai proses read saja yang di terapkan pada semua session termasuk session nya sendiri. Jadi bila ada manipulasi tabel seperti insert, update, delete, truncate status nya akan selalu waiting hingga dilakukan UNLOCK TABLES.

Contoh Skrip:
mysql> LOCK TABLES tabel_telepon READ;
Query OK, 0 rows affected (0.00 sec)

Bila manipulasi insert/update/delete/truncate pada session sendiri, maka akan menampilkan pesan error. Dibawah ini adalah contohnya:
mysql> insert into tabel_telepon values (null, 'DENDIE','081394345678');
ERROR 1099 (HY000): Table 'tabel_telepon' was locked with a READ lock and can't be updated
mysql>

Bila manipulasi insert/update/delete/truncate pada session yang lain maka akan menampilkan proses selalu waiting. Dibawah ini adalah contohnya:
mysql> insert into tabel_telepon values (null, 'ULIE','08133453455');

proses insert diatas akan dieksekusi bila telah di lakukan UNLOCK TABLES pada session yang bersangkutan (session yang melakukan LOCK TABLES), Dibawah ini skrip untuk melakukan unlock tables;
mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)

2. Write Lock, adalah penguncian tabel yang menjadikan tabel tersebut hanya dapat dilakukan manipulai proses read,insert, update, delete, truncate pada session nya sendiri. Dan yang terjadi pada session lain hanya dapat melakukan proses read tabel saja, dan untuk proses yang lain seperti insert, update, delete, truncate status nya akan selalu waiting hingga dilakukan UNLOCK TABLES.

Contoh Skrip:
mysql> LOCK TABLES tabel_telepon WRITE;
Query OK, 0 rows affected (0.00 sec)

Bila manipulasi select/insert/update/delete/truncate pada session sendiri akan mendapatkan hasil sukses, tetapi bila proses select/insert/update/delete/truncate di lakukan pada session yang lain maka akan menampilkan proses yang selalu waiting. Dibawah ini adalah contohnya:
mysql> insert into tabel_telepon values (null, 'DAZ','081334534345');
proses insert diatas akan dieksekusi bila telah di lakukan UNLOCK TABLES pada session yang bersangkutan (session yang melakukan LOCK TABLES), Dibawah ini skrip untuk melakukan unlock tables;
mysql> UNLOCK TABLES;
Query OK, 0 rows affected (0.00 sec)

Tambahan:
  • Database Mysql yang digunakan versi 5.1.37
  • StoreEngine Tabel yang digunakan MyIsam
  • Operasi System Yang digunakan Ubuntu Karmic Koala

SQL tabel_telepon yang digunakan pada contoh diatas:
CREATE TABLE `tabel_telepon` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nama` varchar(255) DEFAULT NULL,
`telepon` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=6 DEFAULT CHARSET=utf8

3 comments:

  1. untuk no 2

    2. Write Lock, adalah penguncian tabel yang menjadikan tabel tersebut hanya dapat dilakukan manipulai proses read,insert, update, delete, truncate pada session nya sendiri. Dan yang terjadi pada session lain hanya dapat melakukan proses read tabel saja,.......

    ralat :

    untuk lock WRITE, session lain proses read juga akan tertunda

    tested on mysql ver 5.7


    terimakasih informasinya....

    ReplyDelete
  2. kenapa lock table tidak bisa di gunakan pada triger before insert? error say:
    LOCK is not allowed in stored procedures

    mohon pencerahan

    ReplyDelete
  3. Bangg, Kira- kira jika pesan kesalahan nya seperti ini. Cara solvenya gimana yaa ?.

    mysqldump: Got error: 1932: "Table 'belajar_mysql.admin' doesn't exist in engine" when using LOCK TABLES

    ReplyDelete