参考
事务
默认情况下,Django事务是自动提交的,一旦数据变动会立即自动提交,不会有隐式回滚
如果要使用事务,有两种方法:
- with用法(推荐)
- 装饰器用法
1. with用法
可以灵活的有选择性的把某些 MySQL 数据库的操作看做一个事务。而且不用关心视图的类型。
比如:
from django.db import transaction
try:
with transaction.atomic():
event = AlarmEvent.objects.get(id=id)
event.msg_channel = msg_channel
event.msg_receiver = msg_receiver
event.msg_result = msg_result
event.save()
return 0, 'success'
except Exception as e:
return 300, '更新数据库失败,失败原因:' + str(e)
这实现了事务,如果更新失败的话,会自动回滚
也可以自己来处理事务,自己控制回滚:
from django.db import transaction
with transation.atomic():
# 设置事务回滚的标记点
sid = transation.savepoint()
try:
t = Events.objects.filter(pk=1).exclude(title__in=["tt", "ttt"]).update(publish_id=3, guige_id=1)
if t == 0:
transaction.savepoint_rollback(sid)
# 提交成功,显式的提交一次事务
transaction.savepoint_commit(sid)
except:
# 回滚
transation.savepoint_rollback(sid)
2. 装饰器用法(不推荐)
这是使用装饰器对view视图开启事务
比如:
from django.db import transaction
@transaction.atomic
def index(request):
//ORM操作
return ....
整个视图中所有 MySQL 数据库的操作都看做一个事务,范围太大,不够灵活。而且无法直接作用于类视图
注意:在原子块中不要进行错误捕获
当退出原子块的时候,Django会去查看它是否正常退出或者是否有异常来确定是否提交或者回滚
如果你捕获并处理了原子块中的异常,可能会隐藏Django中发生问题的事实。这样可能会造成非预期的行为。