我阅读了关于事务的文档,但仍然有点失落,应该怎么做。 可以说我有类书籍(名称,内容,left_key,right_key,级别)在models.py中使用方法,它将书籍内容存储为嵌套集合。我想使用的主要方法是Django models.py事务回滚/提交问题
@transaction.commit_on_success
def add_node(self,right,level):
cursor = connection.cursor()
cursor.execute("UPDATE cms_Book SET left_key = left_key + 2, right_key = right_key + 2 WHERE left_key > %s",[right])
cursor.execute("UPDATE cms_Book SET right_key = right_key + 2 WHERE right_key >= %s AND left_key < %s ",[right,right])
cursor.execute("INSERT INTO cms_Book SET left_key = %s, right_key = %s + 1, level = %s + 1, content='roar'",[right,right,level])
但作为插入主要依赖于从模板作为参数传递键我需要检查,如果正确的钥匙插入。即使例如被插错键,节点仍然会增加没有什么会中断,也不会发生异常,但是逻辑会被打破,这不是很好,以防我需要获得特定的节点,而不是所有的节点。
所以我有其他几种方法来检查逻辑是否正确。这里是其中的一个:
def check_count(self):
q = Book.objects.aggregate(min_key = Min('left_key'),max_key= Max('right_key'),count_all = Count('id'))
return q
我需要的是一种执行在add_node方法的所有动作是什么,然后检查逻辑没有与检查方法打破,如果没有,一切承诺,否则回滚。我什么样的不明白的是,如果我使用try except块我需要DB产生某种错误/异常的也不会,或例如做其中:
if (check_my_table_for_all_different_keys == none):
transactions.commit
else:
transactions.rollback
check_my_table_for_all_different_keys - 如果所有密钥都是唯一的,则不返回任何内容,否则返回相同或具有相同密钥的对象的ID。另外我不确定应该如何确切应该看看我在哪里提交所有3个交易,以防if-else结构的逻辑是正确的,我认为这不是。
问题2)当我试图使用`@ transaction.commit_on_success`没有得到保存到数据库 问题3)将器transaction.commit()保存所有三个查询一次?因为我使用`transaction.commit_unless_managed()`来执行每个查询以保存到数据库。 问题4)如何正确地添加代码到注释:D,因为`代码`只能用于一行,据我了解。 – Viktor 2011-02-04 11:46:25