Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我需要在Django 1.6中提交事务吗?_Django - Fatal编程技术网

我需要在Django 1.6中提交事务吗?

我需要在Django 1.6中提交事务吗?,django,Django,我想创建一个对象,将其保存到DB,然后检查DB上是否有另一行具有相同的标记,执行时间为0。如果有,我想删除创建的对象,然后重新启动进程 transfer = Transfer(token = generateToken(size=9)) transfer.save() while (len(Transfer.objects.filter(token=transfer.token, execution_time=0))!=1): transfer.delete() transfer

我想创建一个对象,将其保存到DB,然后检查DB上是否有另一行具有相同的
标记
,执行时间
为0。如果有,我想删除创建的对象,然后重新启动进程

transfer = Transfer(token = generateToken(size=9))
transfer.save()
while (len(Transfer.objects.filter(token=transfer.token, execution_time=0))!=1):
    transfer.delete()
    transfer = Transfer(token = generateToken(size=9))
    transfer.save()
我是否需要在每个循环之间提交事务?例如,在每个循环结束时调用
commit()

while (len(Transfer.objects.filter(token=transfer.token, execution_time=0))!=1):
    transfer.delete()
    transfer = Transfer(token = generateToken(size=9))
    transfer.save()
    commit()

@transaction.commit_manually
def commit():
    transaction.commit()

根据您的描述,我认为您不需要使用事务。您基本上是使用代码手动重新创建事务回滚

我认为处理这个问题的最好方法是使用数据库约束来强制解决这个问题。是不是
令牌
执行时间
应该是唯一的?在这种情况下,可以使用在Django中定义约束。如果约束是每当执行时间
0
时,
token
应该是唯一的,那么一些数据库也会允许您定义这样的约束

如果约束在数据库中,您只需在循环中执行一次,直到创建了
传输

如果出于任何原因无法在数据库中定义约束,那么我认为您的版本可以工作。(一个改进是使用
.count()
而不是
len

我想创建一个对象,将它保存到DB,然后检查是否有 数据库上具有相同令牌且执行时间为0的另一行。如果 还有,我想删除创建的对象,然后重新启动 过程

根据您的最终目标,有几种方法可以实现这一点:

  • 您是否希望在写入记录时不写入其他记录(以防止重复?)如果是这样,您需要在表上获得一个锁,要做到这一点,您需要使用(1.6中新增的)执行一个原子事务

  • 如果要确保在给定字段组合的情况下不会创建重复记录,则需要在数据库级别使用

  • 我相信将以上两者结合起来会解决你的问题;然而,如果你想要一个更暴力的方法;您可以覆盖对象的
    save()
    方法,然后在尝试创建(或更新)违反约束的记录时引发适当的异常


    在您看来,您将捕获此异常,然后采取适当的操作。

    在django设置中添加atomic=True可能是值得的。这会将每个数据库交互转换为一个事务/1,通常情况下,启动事务不会锁定表(或其等效项)。这取决于数据库、其设置和事务的隔离级别。因此,您不能假设在事务内部运行会阻止并发插入。