我有一个简单的django应用程序来模拟股票市场,用户进来买入/卖出。当他们选择交易时,
我不确定这在django中是如何工作的,但有没有办法使视图原子化?即我担心用户A的行为可能会读取价格,但在由于订单而更新之前,用户B的行动会读取价格。
无法在线找到简单,干净的解决方案。感谢。
答案 0 :(得分:1)
这是数据库事务,有一些注释。 Postgresql的所有注释;所有数据库都有锁定机制,但细节不同。
默认情况下,即使您处于事务中,许多数据库也不会执行此级别的锁定。您需要明确锁定数据。
在Postgresql中,您可能需要SELECT ... FOR UPDATE,它将锁定返回的行。如果另一个用户即将更新它们,则需要在每个想要阻止的SELECT上使用FOR UPDATE。
不幸的是,在Django的ORM中没有办法进行FOR UPDATE。据我所知,你需要稍微破解ORM或使用原始SQL。如果这是低性能代码并且您可以序列化所有对表的访问权限,则可以使用表级LOCK IN EXCLUSIVE MODE,它将序列化整个表。
http://www.postgresql.org/docs/current/static/explicit-locking.html
http://www.postgresql.org/docs/current/static/sql-lock.html
http://www.postgresql.org/docs/current/static/sql-select.html
答案 1 :(得分:0)
相当古老的问题,但自1.6起,您可以使用transaction.atomic()
作为装饰。
<强> views.py 强>
@transaction.atomic()
def stock_action(request):
#trade here
答案 2 :(得分:-1)
包装读取的数据库查询以及在事务中更新的数据库查询。语法取决于您正在使用的ORM。