Транзакции и блокировки на чтение

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
anagamin
Сообщения: 56
Зарегистрирован: 2012.01.19, 12:25

Транзакции и блокировки на чтение

Сообщение anagamin »

Ситуация такая:

Код: Выделить всё

$transaction = Yii::app()->db->beginTransaction();
$cnt=$model->getTotalCards(); //здесь обычный select из кучи таблиц
if($cnt!=0) {
//куча вычислений, с изменением балансов, запросом к платным апи и т.п. В итоге всего этого $model->getTotalCards() вернет уже другой результат
}
$transaction->commit();
Так вот, проблема в том, что если юзер одновремено кликнет 10-100 раз, то успеет запустить вычисления, которые происходят только по условию $cnt!=0, хотя уже внутри первой транзакции в итоге база изменится так, что это условие не должно выполняться.
Т.е. надо как-то заблокировать внутри транзакции чтение, чтобы следующий запрос ждал завершения предыдущей транзакции, и только потом делал выборку. Это реально?
Я вчера весь вечер курил маны, но нашел только необходимость в конфиге мускла (конечно, innoDB) прописать, transaction-isolation = serializable . Но это не помогло.

Спасибо =)

P.S. Предложение изменить архитектуру не приемлимо, потому что в примере очень упрощенная версия, там много нюансов. Да и встречается это в нескольких местах - все переделывать очень долго - надо общее решение.
Ответить