我有一个简单的 django 应用程序来模拟股票市场,用户进来买/卖。当他们选择交易时,
- 读取市场价格,并且
- 根据买/卖订单,市场价格增加/减少。
我不确定这在 django 中是如何工作的,但是有没有办法使视图原子化?即,我担心用户 A 的操作可能会读取价格,但在由于他的订单而更新之前,用户 B 的操作会读取价格。
在网上找不到一个简单、干净的解决方案。谢谢。
这是数据库事务,带有一些注释。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.6开始,您可以transaction.atomic()
用作装饰器。
视图.py
@transaction.atomic()
def stock_action(request):
#trade here
包装在事务中读取和更新的数据库查询。语法取决于您使用的 ORM。