【问题标题】:Nested Transactions in Django 1.4Django 1.4 中的嵌套事务
【发布时间】:2015-04-26 22:14:18
【问题描述】:

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

我正在使用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

【问题讨论】:

    标签: python mysql django transactions


    【解决方案1】:

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

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

    只是一个简短的说明: 除了: transaction.commit()

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-27
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 2016-09-09
      • 2014-12-12
      • 2016-09-10
      相关资源
      最近更新 更多