python - Django 事务管理 block 以未决的 COMMIT/ROLLBACK 结束

标签 python django sqlite django-orm

我有一个需要手动事务管理的 View 函数,但是当我应用 @transaction.commit_manually 装饰器时,django 总是引发以下异常。

正如您从下面的代码跟踪中看到的那样,事务在从 View 返回之前就已提交。

我在 Windows 和 Linux 上都使用 sqlite 和 django 1.4。

下面是django_trace的输出,后面是异常。需要明确的是:无论我是否使用 django_trace 都会发生这种情况,并且当没有装饰器时,不会引发任何异常。这不是由“吞噬”异常引起的。

请注意,下面的第 60 行在上下文处理器内部,因此在 commit_manually 包装 View 之外。

01->mainapp.views:1321:         transaction.commit()
01->mainapp.views:1322:         return render_to_response('mainapp/templates/incorporate.html',
01->mainapp.views:1323:                                       RequestContext(request, form_params))
02-->mainapp.views:60:     transaction.rollback_unless_managed()
02-->mainapp.views:61:     return {'home_login_form': AuthenticationForm(request)}
Traceback (most recent call last):
  File "C:\Users\Marcin\Documents\oneclickcos\lib\site-packages\django\contrib\staticfiles\handlers.py", line 67, in __call__
    return self.application(environ, start_response)
  File "C:\Users\Marcin\Documents\oneclickcos\lib\site-packages\django\contrib\staticfiles\handlers.py", line 67, in __call__
    return self.application(environ, start_response)
  File "C:\Users\Marcin\Documents\oneclickcos\lib\site-packages\django\core\handlers\wsgi.py", line 241, in __call__
    response = self.get_response(request)
  File "C:\Users\Marcin\Documents\oneclickcos\lib\site-packages\django\core\handlers\base.py", line 179, in get_response
    response = self.handle_uncaught_exception(request, resolver, sys.exc_info())
  File "C:\Users\Marcin\Documents\oneclickcos\lib\site-packages\django\core\handlers\base.py", line 221, in handle_uncaught_exception
    return debug.technical_500_response(request, *exc_info)
  File "C:\Users\Marcin\Documents\oneclickcos\lib\site-packages\django\core\handlers\base.py", line 111, in get_response
    response = callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\Marcin\Documents\oneclickcos\oneclickcos\mainapp\decorators.py", line 26, in _wrapped_view
    return view_func(request, *args, **kwargs)
  File "C:\Users\Marcin\Documents\oneclickcos\lib\site-packages\django\db\transaction.py", line 209, in inner
    return func(*args, **kwargs)
  File "C:\Users\Marcin\Documents\oneclickcos\lib\site-packages\django\db\transaction.py", line 203, in __exit__
    self.exiting(exc_value, self.using)
  File "C:\Users\Marcin\Documents\oneclickcos\lib\site-packages\django\db\transaction.py", line 288, in exiting
    leave_transaction_management(using=using)
  File "C:\Users\Marcin\Documents\oneclickcos\lib\site-packages\django\db\transaction.py", line 52, in leave_transaction_management
    connection.leave_transaction_management()
  File "C:\Users\Marcin\Documents\oneclickcos\lib\site-packages\django\db\backends\__init__.py", line 119, in leave_transaction_management
    raise TransactionManagementError("Transaction managed block ended with "
TransactionManagementError: Transaction managed block ended with pending COMMIT/ROLLBACK

明确地说,我已经检查了关于这个主题的其他问题,但他们没有解决我的问题。

最佳答案

事实证明,在模板渲染期间,有数据库访问,所以通常的模式是这样的:

return render_to_response('mainapp/templates/incorporate.html',
                          RequestContext(request, form_params))

是问题的原因。我需要将其替换为:

retval = render_to_response('mainapp/templates/incorporate.html',
                                      RequestContext(request, form_params))
transaction.commit()
return retval

此外,其他 SO 答案显示事务管理装饰器隐藏所有异常,而是引发事务管理异常。不幸的是,诊断此问题的最简单方法是在没有装饰器的情况下运行,并查看是否发生异常,或者将整个 View 包装在 try/except 中。

关于python - Django 事务管理 block 以未决的 COMMIT/ROLLBACK 结束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9955321/

相关文章:

python - Python 3 中的字符串格式化

django - 缩小 Django 表单中的选择范围

c# - 如何在 Windows 10 C# 中更新 sqlite.net pcl 中的行?

python - 名称 'newList' 未定义

python - 基于时间的算法中的优化

python - 在numpy数组中查找最大元素的索引,不包括少数索引

python - 这是 POST 正文的正确格式吗?

django - Heroku。 Django转储数据

android没有这样的表错误

c# - 如何检查表存在于 db sqlite xamarin iOS