Django,如何使视图原子?

时间:2009-07-20 19:38:27

标签: python database django locking atomic

我有一个简单的django应用程序来模拟股票市场,用户进来买入/卖出。当他们选择交易时,

  1. 读取市场价格,
  2. 根据买入/卖出订单,市场价格上涨/下跌。
  3. 我不确定这在django中是如何工作的,但有没有办法使视图原子化?即我担心用户A的行为可能会读取价格,但在由于订单而更新之前,用户B的行动会读取价格。

    无法在线找到简单,干净的解决方案。感谢。

3 个答案:

答案 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。