Session Locking? Slow Query Log Isinya Query Session?

Masalah

Mekasnisme session default di php adalah locking/blocking. Misal ada 5 request dari orang yang sama (id session yang sama) bersaman yang menggunakan session, kelima request tersebut tidak bisa berjalan bersamaan, melainkan hanya satu request yang dapat berjalan, yang lainnya menunggu sampai request yang berjalan tersebut selesai (ngantri).

Hal ini tujuannya untuk mencegah race condition. Misalkan ada session variable bernama jk (jumlah keranjang) yang menghitung jumlah barang di keranajng. User menambah barang a dan b, awalnya jumlah keranjang ada 10, setelah ditambah 2 barang tersebut menajdi 12.




session
jk = 10



















locking






concurrent / no locking
















request 1
jk =jk + 1
jk = 10 + 1 = 11


request 1
jk =jk + 1
jk = 10 + 1 = 11

request 2
jk = jk + 1
jk = 10 + 1 = 12
request 2
jk = jk + 1
jk = 11 + 1 = 12













































Final result

jk = 12





jk = 11



Ink Drawings
Ink Drawings
Ink Drawings
Ink Drawings
Ink Drawings
Ink Drawings
Ink Drawings
Ink Drawings
Ink Drawings
Ink Drawings
Ink Drawings
Ink Drawings

Sebenenrya hal ini tidak ada masalah karena delay waktu karena blocking/locking tidak signifikan. Namun jika dalam request tersebut ada query yang memakan waktu lama, efeknya akan berkali kali lipat lama nya.

Misalkan waktu setiap request adalah 0.5 detik. Dalam 1 halaman ada 5 ajax akan memakan waktu 2.5 detik. dan jika ada query lemot yang menyebabkan request selesai 4 detik, waktu halaman load akan menjadi 20 detik. Belum lagi webserver akan naik utilitasinya karena menerima banyak koneksi yang nganggur.

Solusi 0

Benerin query yang lain. Kalau dilihat di slow query log, yang kelihatan banyak adalah sesison locking. Tapi sebenernya session locking cuma kambing hitam saja. Kalau di telusuri lagi pasti ada sebab query yang bikin lemot, dan session locking membuat komplikasi penyakit lemot nya ini.

Solusi 1

https://stackoverflow.com/questions/3371474/php-sessions-is-there-any-way-to-disable-php-session-locking

https://ma.ttias.be/php-session-locking-prevent-sessions-blocking-in-requests/

Bisa dilihat diatas ada berbagai cara

  • Mengganti library yang non locking
  • Meunggunakan session_write_close di php (setelah memanggil itu session hanya bisa di baca, tidak bisa di update)
  • Menggunaakan redis karena tidak mempunyai mekanisme locking

Solusi 2

Namun menurut saya session locking sudah tidak relevan saat ini. Untuk fitur yang berpotensi menimbulkan race condition, bisa di lock menggunakan transaksi database, sehingga fitur lain nya tidak berpengaruh dengan locking

guest
0 Comments
Inline Feedbacks
View all comments