繁体   English   中英

Django 1.4中的嵌套事务

[英]Nested Transactions in Django 1.4

启用功能A()进行手动交易。 它具有数据库事务,并在发生任何错误时回滚。 该函数调用另一个未针对手动事务启用的函数,但具有数据库事务的情况也会在发生异常的情况下引发错误。 在这种情况下,是否会在调用的函数中回滚父函数的回滚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

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

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

简要说明:除外:transaction.commit()

这可能是任何异常的不希望有的行为,但是如果异常是与数据库相关的错误(将事务标记为中断),则会引发另一个错误。 在这种情况下,需要回滚。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM