Hello! 欢迎来到小浪资源网!


PHP乐观锁加事务扣款为何只成功一次?


PHP乐观锁加事务扣款为何只成功一次?

php使用乐观锁加事务扣除余额为何只成功扣了1次?

在扣除用户余额时,出现了只扣除一次的情况,究其原因是以下几个方面:

事务范围错误

应将与金额相关的操作都置于事务中,但实际代码中使用了 find 查询,该查询会执行一个 select 语句,这是错误的事务使用方式。

立即学习PHP免费学习笔记(深入)”;

乐观锁使用错误

find 查询后,再调用 save 更新余额,ではなく乐观锁的预期行为。乐观锁的预期 sql应该是仅在旧余额为指定值时更新新余额。

事务管理错误

Db::transaction 启动的事务不需要手动提交,因为内部会自动提交。如果出现异常,只需抛出异常,事务内部会自动回滚并继续抛出异常。

第二种方式奏效的原因

第二种方式奏效是因为隔离了查询用户信息和更新余额的操作,防止了并发时的超卖问题,但仍存在乐观锁使用错误的问题。正确的做法是将查询余额和更新余额都置于事务中,并使用乐观锁判断旧余额是否为指定值,以确保更新的正确性。

相关阅读