ferhatyesilmen
Arkadaşlar merhaba ,
Kullanıcılar tablosu:
----------------------------------------------
id | ... | bakiye
----------------------
1 | .... | 1000
işlemler tablosu
----------------------------------------
| id | user_id | onceki_bakiye | sonraki_bakiye |
--------------------------------------------------------------------------------------------
1 | 1 | 1000.00 | 990.00 | 100 TL lik bir işelm
2 | 1 | 990.00 | 840.00 | 150 TL lik bir işlem -- aynı ms.
3 | 1 | 990.00 | 950.00 | 40 TL lik bir işlem -- aynı ms.
kullanıcılar sistemde işlem yaptıkça işlemler tablosuna kayıt ekliyorum. İşlem tutarınıda kullanıcılar tablosunda bakiye alanına güncelliyorum.
normal şartlarda 3 nolu işlemnde önceki bakiye 9750 - sonraki 9710 olması gerekirken, yukarıdaki gibi oluyor. Sebebi ise aynı ms de gelmeleri 100 işlemden biri bu şekilde olabiliyor.
Bu gibi bir senaryo için nasıl bir yol izlenmeli?
DB::beginTrasnaction();
try {
...
..
DB::commit();
return true;
}catch(\Exception $e) {
DB::rollBack();
return false;
}
şeklinde kullanıyorum. LockForUpdate() ile ilgili bir kaç örnek okudum. Nasıl kullanılır? ve ne gibi riskleri var bu konuda bilgi verebilirseniz sevinirim. Şimdiden teşekkürler.
Laravel 5.4 -- postgreSQL 9.5
puppet
Kullandığınız sorguyu yazmadığınız için yorum yapmak mümkün değil yukarıdaki işlem için.
Fakat genel olarak bakiyeleri database'e yazmanız yanlış yaptığınızı gösteriyor. Her zaman bakiyeyi işlemleri toplayarak hesaplamanız gerekiyor.
Örnek:
islem = +1000
islem = -100
islem = -150
islem = -40
SUM(islem)
Sonuç bakiye SUM işlemi ile 710 olarak alınır. Aynı ms içinde bile olsa hesap karışmaz.
Burada eksi bakiyeye düşme olabilir, bu engellenmek isteniyorsa stored procedure tarzı, transaction içinde SUM ile bakiyenin eksiye düşüp düşmediğini kontrol edebilirsiniz.
Kolay gelsin