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.