Django框架事务处理详解:ORM与自定义SQL事务管理

林见深
林见深
发布时间:2026-10-13 | 6人浏览过
原创

本文详解Django框架中的事务处理机制,涵盖基于ORM的自动提交、通过TransactionMiddleware拦截HTTP请求的事务控制,以及针对复杂或大批量SQL的自定义事务管理。重点解析autocommit、commit_on_success及commit_manually装饰器的使用场景与注意事项,帮助开发者灵活掌握Django数据库事务的最佳实践。

本文介绍Django框架中事务处理的核心机制,旨在为开发者提供实用的参考方案。

Django事务处理的两种主要场景

在Django开发中,事务处理主要涉及两种典型场景:

第一种是基于Django ORM模型的事务处理;

第二种是针对自定义SQL语句的事务处理。后者通常用于处理复杂的SQL逻辑,当ORM操作显得不便时,或者在需要执行大批量SQL语句且对执行效率有较高要求的场景下使用。

自定义SQL事务处理示例

首先探讨第二种情况,即自定义SQL的事务处理,因其相对简单且不涉及ORM的额外开销,以下通过一个封装方法来说明具体实现。


from django.db import connection, transaction
.....
def batch_execsql(sqlarray):
  cursor = connection.cursor() # 得到处理的游标对象
  ret=""
  try:
    for sql in sqlarray:
      cursor.execute(sql)
    transaction.commit_unless_managed() # 这是重点,没有这条语句,就不会commit 。
  except Exception,e: #简单的异常处理,可以忽略
    ret=str(e)
  cursor.close()
  return ret #有异常则返回异常,否则返回为空字符串

从上述代码可以看出 transaction.commit_unless_managed() 的关键作用,这是在自定义SQL场景下处理事务的核心方法。示例中的 sqlarray 是一个列表,包含多条自定义SQL语句,这些语句必须在同一个事务中执行完毕。

ORM事务处理与中间件配置

接下来分析第一种情况,即在使用ORM时如何处理事务。Django官方文档对此有明确说明,此处进行简要翻译和介绍。

1. Django默认的事务机制是自动处理的。当调用ORM的 model.save() 或 model.delete() 方法时,所有数据修改会立即提交到数据库,这相当于数据库开启了 auto commit 模式,不存在隐藏的 rollback(回滚)操作。

2. 对HTTP请求进行事务拦截,这是官方推荐的方式。该方法通过 TransactionMiddleware 中间件实现,虽然效果良好,但必须在 settings.py 配置文件中明确启用。


MIDDLEWARE_CLASSES = (
  'django.middleware.cache.UpdateCacheMiddleware',
  'django.contrib.sessions.middleware.SessionMiddleware',
  'django.middleware.common.CommonMiddleware',
  'django.middleware.transaction.TransactionMiddleware',
  'django.middleware.cache.FetchFromCacheMiddleware',
)

需要注意的是,启用此配置后,中间件的加载顺序至关重要。位于 TransactionMiddleware 之后的所有中间件都将受到事务控制。例如,若将 session 中间件置于 TransactionMiddleware 之后,会话状态也会受事务影响。然而,CacheMiddleware、UpdateCacheMiddleware 和 FetchFromCacheMiddleware 不受此限制,因为缓存机制使用独立的连接处理数据。

此外,TransactionMiddleware 仅对 settings.py 中配置的 default 数据库有效。若需对其他数据库连接应用相同的事务控制,必须自行实现相应的中间件。

手动事务控制与装饰器使用

3. 手动控制事务。在此模式下,开发者拥有完全的事务控制权,无需在 settings.py 中配置 TransactionMiddleware,通常采用装饰器模式来实现。

a) 使用 @transaction.autocommit 装饰器,这是Django默认的事务处理方式。应用此装饰器会忽略全局的 transaction 配置,强制采用自动提交模式。


from django.db import transaction
@transaction.autocommit
def viewfunc(request):
  ....
@transaction.autocommit(using="my_other_database")
def viewfunc2(request):
  ....

b) 使用 @transaction.commit_on_success 装饰器,该方法会在方法执行完毕且无异常时自动提交事务。


from django.db import transaction
@transaction.commit_on_success
def viewfunc(request):
  ....
@transaction.commit_on_success(using="my_other_database")
def viewfunc2(request):
  ....

c) 使用 commit_manually() 进行完全手动控制。若开发者未显式调用 commit() 或 rollback(),系统将抛出 TransactionManagementError 异常。


from django.db import transaction
@transaction.commit_manually
def viewfunc(request):
  ...
  # You can commit/rollback however and whenever you want
  transaction.commit()
  ...
  # But you've got to remember to do it yourself!
  try:
    ...
  except:
    transaction.rollback()
  else:
    transaction.commit()
@transaction.commit_manually(using="my_other_database")
def viewfunc2(request):
  ....

希望本文关于Django框架下Python程序设计的事务处理内容能对大家有所帮助。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表