При десятках одновременных запросах баланс пользователя списывается не правильно.
Гуглил, изучал, читал, как я понял для этого используют транзакции.
Накинул такой код:
<?php
try {
$objDBCD14->autocommit(false);
$objDBCD14->begin();
$rsMyCredits = $objDBCD14->queryUniqueObject("SELECT Balance FROM tbl_users WHERE UserId = '" . $rs->UserId . "'");
$myCredits = somedecrypt($rsMyCredits->Balance);
$finalBalance = $myCredits - $servicePrice;
$encryptedCredits = someencrypt($finalBalance);
$objDBCD14->execute("INSERT INTO tbl_credit_history SET UserId = '" . $rs->UserId . "', Credits = '" . $servicePrice . "', HistoryDtTm = '" . $currDtTm . "', CreditsLeft = '" . $encryptedCredits . "'");
$objDBCD14->execute("UPDATE tbl_users SET Credits = '" . $encryptedCredits . "' WHERE UserId = '" . $rs->UserId . "'");
$objDBCD14->commit();
$objDBCD14->autocommit(true);
} catch (Exception $e) {
$objDBCD14->rollback();
}
?>
Но проблема как была, так и есть. Да, знаю, что баланс пользователя лучше считать напрямую в SQL запросе, но в данной ситуации баланс пользователя закодирован некой функцией, как вы можете видеть по коду.
Вопрос: Как же все таки решается эта проблема? Транзакциями? тогда что я делаю не так?