php使用乐观锁加事务扣除余额为何只成功扣了1次?
在扣除用户余额时,出现了只扣除一次的情况,究其原因是以下几个方面:
事务范围错误
应将与金额相关的操作都置于事务中,但实际代码中使用了 find 查询,该查询会执行一个 select 语句,这是错误的事务使用方式。
立即学习“PHP免费学习笔记(深入)”;
乐观锁使用错误
find 查询后,再调用 save 更新余额,ではなく乐观锁的预期行为。乐观锁的预期 SQL应该是仅在旧余额为指定值时更新新余额。
事务管理错误
Db::transaction 启动的事务不需要手动提交,因为内部会自动提交。如果出现异常,只需抛出异常,事务内部会自动回滚并继续抛出异常。
第二种方式奏效的原因
第二种方式奏效是因为隔离了查询用户信息和更新余额的操作,防止了并发时的超卖问题,但仍存在乐观锁使用错误的问题。正确的做法是将查询余额和更新余额都置于事务中,并使用乐观锁判断旧余额是否为指定值,以确保更新的正确性。
以上就是PHP乐观锁加事务扣款为何只成功一次?的详细内容,更多请关注【创想鸟】其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/1425759.html