from django.db import transaction # 导入事务
class XXX(APIView):
@transaction.atomic
# transaction.atomic装饰器可以保证该函数中所有的数据库操作都在一个事务中。
def XXX(self,request):
# 开启事务
with transaction.atomic ():
# 设置事务保存点
s1 = transaction.savepoint ( ) # 可以设置多个保存点
try:
# 数据库操作
for i in eval (Works.objects.filter (id=wid).first ( ).next_id):
Task.objects.filter(uid=i).update(state=state, opinion=opinion)
except Exception as e:
# 事务回滚 (如果发生异常, 就回滚事务)
transaction.savepoint_rollback (s1)
else:
# 提交事务 (如果没有异常,就提交事务)
transaction.savepoint_commit (s1)
导包transaction
设置该函数中的所有数据库操作在同一个事物中,第一个数据库操作1即使成功保存到数据库中,只要第2个数据操作失败,那么所有该段代码所有涉及的数据库操作都会更改回滚到原来。
@transaction.atomic
transaction.atomic装饰器可以保证该函数中所有的数据库操作都在一个事务中。
with transaction.atomic()
设置事务保存点并开启事务
s1 = transaction.savepoint() # 开启事务设置事务保存点
数据库读写操作
操作1
操作2
失败回滚事务(条件:任意一个操作失败,数据库操作发生异常,回滚到设置的事务保存点)
transaction.savepoint_rollback(s1)
成功(条件:操作1和2都成功,提交事务)
transaction.savepoint_commit(sid) # 如果没有异常,成功提交事务