用了 transaction.atomic 还需要用 select_for_update 么?

2017-03-09 14:36:56 +08:00
 phithon

如何消除条件竞争相关的漏洞,比如商品购买的逻辑,先判断用户是否有足够的金币,有则扣除金币,增加购买日志。

如果两个线程同时访问这个逻辑,就可以造成在第一个线程还没扣除用户金币的情况下第二个线程也过了判断,最后金币扣成负数。

如果我将这一堆逻辑放在一个 view 里,并在 view 的外层使用 @transaction.atomic 修饰,是不是可以保证不会出现上述问题?

这种情况下,还需要调用 select_for_update 么?

有篇文章说了一下 https://kuanyui.github.io/2015/03/14/django-db-transaction/ ,但我还是不太肯定,特地来请教大家

4146 次点击
所在节点    Django
1 条回复
phithon
2017-04-09 16:21:32 +08:00
需要

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/346133

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX