Django中的每会话事务

Ali*_*ell 8 python django transactions

我正在创建一个Django Web应用程序,它允许用户在通过最终POST将数据库提交到数据库(或还原)之前,在一系列GET/POST上构建一组更改.我必须保持更新与任何并发数据库用户隔离,直到它们被确认(这是一个配置前端),排除在每次POST后提交.

我首选的解决方案是使用每会话事务.这样可以记住在其所属的数据库中记住更改内容(以及它如何影响后续查询)以及实现提交/回滚的所有问题.死锁和长期锁定不是问题,因为由于外部约束,任何时候只能有一个用户配置系统,并且它们表现良好.

但是,我找不到有关设置Django的ORM以使用这种事务模型的文档.我把一个最小的猴子补丁(ew!)放在一起解决问题,但不喜欢这样一个脆弱的解决方案.有没有其他人这样做过?我在某个地方错过了一些文档吗?

(我的Django版本是1.0.2 Final,我使用的是Oracle数据库.)

S.L*_*ott 8

多个并发的会话规模事务通常会导致死锁或更糟(更糟糕的是= =活锁,长时间延迟而另一个会话持有锁.)

这种设计不是最好的策略,这就是Django不鼓励它的原因.

更好的解决方案如下.

  1. 设计记录用户更改的Memento类.这可以是其表单输入的保存副本.如果状态更改很复杂,您可能需要记录其他信息.否则,表单输入的副本可能就足够了.

  2. 在会话中累积Memento对象的序列.请注意,事务中的每个步骤都将涉及从数据中获取并进行验证,以查看纪念链是否仍然"有效".有时他们不会工作,因为其他人在这一系列纪念品中改变了一些东西.现在怎么办?

  3. 当你提出'准备提交?' 页面,你已经重播了Mementos的序列,并且非常确定它们会起作用.提交"提交"时,您必须最后一次重播Mementos,希望它们仍然可以继续工作.如果他们这样做,那很好.如果他们不这样做,有人改变了一些东西,你又回到了第2步:现在怎么样?

这似乎很复杂.

是的,它确实.然而,它没有任何锁定,允许起泡速度和很少的死锁机会.事务仅限于"提交"视图功能,该功能实际上将Mementos序列应用于数据库,保存结果,并执行最终提交以结束事务.

另一种选择 - 当用户在n-1步骤中走出一杯快速咖啡时保持锁定是不可行的.

有关Memento的更多信息,请参阅此内容.