Makanan Apa Sih MVCC?

PostgreSQL Database MVCC

PostgreSQL | Setiap programmer yang pernah membuat aplikasi multi-user pasti pernah dibuat  frustrasi gara-gara lock bisa menyebabkan  pengguna menunggu atau bahkan sampai deadlock dan aplikasi hang. walaupun database yang digunakan sudah menggunakan table-level, page-level, column-level, atau row-level locking, masalah yang sama tetap muncul: SELECT oleh satu user nge-block UPDATE oleh user lain sampai transaksi user pertama selesai, dan juga sebaliknya UPDATE satu user nge-block SELECT oleh user lainnya sampai transaksi user pertama selesai. 

Namun bagi Anda yang sudah menggunakan PostgreSQL pasti tahu bahwa problem seperti di atas tidak akan terjadi karena di PostgreSQL ada fitur canggih yang disebut Multi-Versioning Concurrency Control (MVCC) sehingga SELECT tidak pernah nge-block UPDATE, dan UPDATE tidak pernah nge-block SELECT. 

Dinamakan Multi-Versioning versi data yang dilihat oleh satu user (atau satu transaction) akan berbeda dengan data yang terlihat oleh user yang ada di transaction lain. Artinya perubahan data yang terjadi dalam database melalui UPDATE, INSERT, atau DELETE yang dilakukan oleh satu transaction tidak akan terlihat oleh user lain yang berbeda transaction. Perubahan baru akan terlihat  ketika sudah terjadi COMMIT.

Sebuah contoh sederhana di bawah ini menunjukkan perbedaan antara low-level locking di sistem database tradisional dengan MVCC yang ada di PostgreSQL.

SELECT headline FROM news_items

Pernyataan ini membaca data dari sebuah table bernama news_items dan menampilkan semua baris dalam kolom yang disebut headline. Untuk database yang menggunakan low-level locking, pernyataan SELECT tidak akan berhasil dan harus menunggu jika ada pengguna lain secara bersamaan memasukkan (INSERT) atau memperbarui (UPDATE) data dalam tabel item berita. Transaksi yang mengubah data memegang lock pada row yang diubah dan karena itu semua baris dari tabel tidak dapat ditampilkan. Pengguna yang menunggu karena ter-block bisa frustrasi karena tidak tahu kapan lock akan dilepas. Bayangkan jika si pengguna yang melakukan perubahan data lupa COMMIT dan meninggalkan komputernya untuk makan siang..... :))

Dalam PostgreSQL, dalam kondisi apapun, pengguna selalu dapat melihat tabel news_items. Tidak perlu menunggu lock dilepas, bahkan jika beberapa pengguna yang memasukkan dan memperbarui data dalam tabel. Ketika seorang pengguna menjalankan query SELECT, PostgreSQL menampilkan snapshot, atau versi, dari semua data yang dilakukan sebelum perubahan dilakukan oleh pengguna lain. Update data apapun yang merupakan bagian dari transaksi yang dilakuka  oleh user lain tidak akan terlihat. cukup masuk akal, bukan?

Mengenai bahasan tentang bagaimana MVCC bekerja di PostgreSQL di sini.

PostgreSQL Database MVCC