Django框架事务处理详解:ORM与自定义SQL事务管理
本文详解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程序设计的事务处理内容能对大家有所帮助。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













