【发布时间】:2012-01-11 23:32:25
【问题描述】:
我在 User 表中有一个字段,用于保存用户的帐户余额。用户可以使用我的服务执行很多操作,这将导致他们的余额快速变化。
我正在尝试使用 mysql 的可序列化隔离级别来确保多个用户操作不会错误地更新值。 (动作 A 和动作 B 同时想从余额中扣除 1 美元。)但是,我遇到了很多死锁错误。
我如何正确地做到这一点而不会出现所有这些死锁,并且仍然保持余额字段是最新的?
简单模式:用户有一个 id 和一个余额。
我正在使用学说,所以我正在做类似以下的事情:
$con->beginTransaction();
$tx = $con->transaction;
$tx->setIsolation('SERIALIZABLE');
$user = UserTable::getInstance()->find($userId);
$user->setBalance($user->getBalance() + $change);
$user->save();
$con->commit();
【问题讨论】:
-
如果您提供了架构以及选择、更新以及所有事务性完成的访问模式,那么解决这个问题会更容易。
标签: mysql serialization