Django 1.4中的嵌套事务

时间:2015-02-25 02:43:14

标签: python mysql django transactions

为手动交易启用了功能A()。它有数据库事务并在出现任何错误时回滚。此函数调用另一个未启用手动事务的函数,但是如果发生异常,db事务也会引发错误。在这种情况下,将在被调用函数中回滚父函数rollback db edit语句吗?

我正在使用Mysql

import sys
import os

from polls.models import Choice
from django.db import transaction


def s1():
    with transaction.commit_manually():
        try:
            print "First Fun"
            choice_obj = Choice.objects.create(
                choice_text="heyaa", votes='1', question_id='1')
            s2()
            transaction.commit()

        except:
            print "Roll Fun"
            transaction.commit()
            transaction.rollback()


def s2():

    try:
        print "Second Fun"
        choice_obj = Choice.objects.create(
            choice_text="abcaa", votes='1', question_id='1')
        print a

    except:
        raise

1 个答案:

答案 0 :(得分:0)

是的,它也将被回滚,但如果你先在except块中提交它并且没有与数据库相关的异常阻止提交,则不会回滚。

数据库事务的定义(原子,一致,隔离,持久)可以防止它可以嵌套。可以使用保存点(Django 1.6+使用)来模拟一种嵌套事务,尽管这些不是真正的事务。在任何情况下,如果回滚最外层事务(即唯一真正的数据库事务),则回滚整个事务。

快速说明:     除了:         器transaction.commit()

这可能是任何异常的不良行为,但如果异常是与事务标记为已损坏的数据库相关错误,则会引发另一个错误。在这种情况下,需要回滚。