为手动交易启用了功能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
答案 0 :(得分:0)
是的,它也将被回滚,但如果你先在except
块中提交它并且没有与数据库相关的异常阻止提交,则不会回滚。
数据库事务的定义(原子,一致,隔离,持久)可以防止它可以嵌套。可以使用保存点(Django 1.6+使用)来模拟一种嵌套事务,尽管这些不是真正的事务。在任何情况下,如果回滚最外层事务(即唯一真正的数据库事务),则回滚整个事务。
快速说明: 除了: 器transaction.commit()
这可能是任何异常的不良行为,但如果异常是与事务标记为已损坏的数据库相关错误,则会引发另一个错误。在这种情况下,需要回滚。