php使用乐观锁加事务扣除余额为何只成功扣了1次?
在扣除用户余额时,出现了只扣除一次的情况,究其原因是以下几个方面:
事务范围错误
应将与金额相关的操作都置于事务中,但实际代码中使用了 find 查询,该查询会执行一个 select 语句,这是错误的事务使用方式。
立即学习“PHP免费学习笔记(深入)”;
乐观锁使用错误
find 查询后,再调用 save 更新余额,ではなく乐观锁的预期行为。乐观锁的预期 sql应该是仅在旧余额为指定值时更新新余额。
事务管理错误
Db::transaction 启动的事务不需要手动提交,因为内部会自动提交。如果出现异常,只需抛出异常,事务内部会自动回滚并继续抛出异常。
第二种方式奏效的原因
第二种方式奏效是因为隔离了查询用户信息和更新余额的操作,防止了并发时的超卖问题,但仍存在乐观锁使用错误的问题。正确的做法是将查询余额和更新余额都置于事务中,并使用乐观锁判断旧余额是否为指定值,以确保更新的正确性。