2

我有一个 Django (1.4.2) 数据模型,如下所示:

class CoreData(models.Model):
    cdid = models.AutoField(primary_key=True,editable=False)
    atr1 = # whatever
    atr2 = # whatever

class EnvironData(models.Model):
    cdid = models.ForeignKey(CoreData)
    # etc

class TransactionData(models.Model):
    edid = models.ForeignKey(EnvironData)
    # etc

我需要一个原子事务,在其中更新etc事务数据:

tdo = TransactionData.objects.select_for_update().get(etc=criteria)
# process transaction
# modify tdo object
tdo.save()

到目前为止,一切都很好。但是,在 的过程中process transaction,我需要检查CoreData.atr1CoreData.atr2

如果我通过这些访问,tdo.edid.cdid.atr{1,2}那么我的理解是我会有一个额外的读取数据库查询,因为 Django 会获取丢失的数据。(老实说,我不能 100% 确定它只是一个;也可能是两个——甚至是六个,但我对此表示怀疑。)

另一方面,如果我结合select_related()使用,select_for_update()我不仅会锁定不需要(也不应该)锁定的数据,还会为tdo.save().

第三种方法可能是通过独立查询(与 无关tdo)获取数据,如果使用该查询,则可以保证是单个数据库查询select_related()。另外,它可以使用values().

我认为最后一种方法是最有效的,也是因为查询可以从我已经拥有 as的EnvironData对象开始。edidtdo.edid_id

我的观点合理吗?有没有更好的方法?

更新:完全可以tdo.edid.cdid.atr{1,2}独立访问,甚至可以在交易期间更改它们,因为它们彼此独立,并且不需要它们在整个交易过程中保持其价值。(谢谢@Uszy Wieloryba)

4

1 回答 1

0

如果您# process transaction依赖CoreData.atr1and CoreData.atr2,也许它们应该被锁定。

于 2013-03-15T09:28:36.233 回答