Optimistic Locking Pada Database

Pembahasan kali ini berawal dari pertanyaan salah satu pembaca ebook MERN (https://bit.ly/bukureactid).

Sebetulnya sudah dijelaskan di ebook tetapi saya rasa saya perlu membahas lebih detail di artikel tersendiri karena topik ini tidak secara langsung terkait dengan materi ebook.

Pada saat menggunakan Mongoose sebagai ORM untuk menangani MongoDB, kita akan menjumpai property __v pada setiap record yang dibuat ke MongoDB Collection.

Property apa itu? dan gunanya buat apa?

Sebetulnya property __v merupakan cara dari Mongoose untuk melakukan tracking versi terhadap dokumen di Collection.

Oleh karena itu pada saat pertama kali insert nilai dari __v adalah 0.

Jika kemudian dokumen tersebut diupdate makan akan dilakukan increment terhadap property tersebut, menjadi 1, kemudian 2, dan seterusnya sesuai dengan update yang dilakukan.

Lalu apa gunanya? Gunanya adalah untuk melakukan Optimistic Locking.

Optimistic Locking memastikan bahwa dokumen tidak berubah saat operasi yang sedang berjalan belum selesai.

Misalnya begini, user A mengambil data produk 1 dengan nilai __v adalah 0, kemudian user B juga membaca data produk 1 juga dengan nilai __v sama yaitu 0.

Keduanya merupakan staff toko yang bisa mengupdate produk, misalnya user B mengupdate harga produk dari 90rb menjadi 120rb, maka Mongoose akan mengubah property __v menjadi 1.

User A yang sudah mengambil data juga sebelumnya dengan versi __v bernilai 0, belum tahu perubahan yang dilakukan oleh B.

Kemudian ia mengubah deskripsi produk dan harga produk, tetapi pada saat mengupdate melalui Mongoose, Kita bisa mengecek versi __v yang dikirim oleh user A adalah 0 tetapi di database / collection nilai __v untuk produk yang sama sudah menjadi 1.

Dengan pengecekkan tersebut kita bisa tahu bahwa payload update yang dikirim oleh user A sudah usang dan bisa jadi konflik dengan update yang sebelumnya dilakukan user B.

Maka kita bisa menolak update dari user A.

Kapan fitur itu berguna?

Fitur ini berguna di saat kita membuat document yang bisa diedit oleh lebih dari satu user. Ya misalnya seperti tadi produk yang bisa diedit oleh banyak akun staff.

Tentu kurang bermanfaat untuk data misalnya profile user, karena yang bisa mengupdate seharusnya ya user itu sendiri.

Jadi penggunaannya memang bergantung kasusnya.

Apakah bisa didisable?

Bisa, di Mongoose bisa dilakukan disabled dengan menambahkan versionKey: false pada Schema.

Bahkan kita bisa mengubah propertynya menjadi selain __v dengan menggunakan versionKey: 'sesuatu' sehingga version key yang dipakai menjadi sesuatu bukan lagi __v.

Jika kamu masih bingung soal MongoDB atau Mongoose, silahkan kamu juga bisa mempelajarinya secara lebih detail dan praktik langsung melalui ebook https://bit.ly/bukureactid

Sekian dulu ya sharing kali ini.


Penulis artikel
Muhammad Azamuddin
Indiehacker & Fullstack Web Developer

Muhammad Azamuddin merupakan seorang Indie hacker dan profesional fullstack web developer dengan pengalaman lebih dari 10 tahun. Selain itu dia juga menulis ebook best-seller buku-laravel-vue.com dan ebook lainnya di literasikode.com.

Dia juga merupakan profesional fullstack developer untuk Toptal

IG: @mas.azamuddin
FB: fb.me/script.holic
Email: mas.azamuddin@gmail.com
Homepage: azamuddin.com