如何解决如何在Django或DRF中实现这种自定义回滚?
Out系统访问中间平台(我不知道该怎么用英语称呼,我们称其为中台
中文),该平台用于身份验证,例如登录,JWT
验证等。
然后,由于意外程序错误而需要回滚操作时,我们遇到了很多问题。像下面的代码一样,该程序在1 / 0
上运行时将崩溃,然后可以AdminPermission.objects.create
进行回滚,但是do_user_actions
不能,因为它是一个RPC函数。因此,我们需要重写transaction.atomic或类似的东西来实现我们的要求。但是,我不知道如何实现它。请给我一些建议或示例代码。非常感谢。
@transaction.atomic # can not rollback remote func call `do_user_actions`
def create(self,request,*args,**kwargs):
# call a remote func here to create a admin account.
user_dict = do_user_actions(query_kwargs=query_kwargs,action='create-admin')
user_id = user_dict.get('id')
permission_code = 'base_permission'
AdminPermission.objects.create(user_id=user_id,permission_code=permission_code)
# some unexpected errors,like:
1 / 0
return Response('success')
解决方法
您可以将其用作上下文管理器,而不是与装饰器一起使用atomic
,
with transaction.atomic():
try:
# do your stuff
user_dict = do_user_actions(query_kwargs=query_kwargs,action='create-admin')
user_id = user_dict.get('id')
permission_code = 'base_permission'
AdminPermission.objects.create(user_id=user_id,permission_code=permission_code)
1/0 # error
except SomeError: # capture error
revert_user_actions() # revert do_user_actions
transaction.set_rollback(True) # rollback
return Response(status=status.HTTP_424_FAILED_DEPENDENCY) # failure
return Response(serializer.data,status=status.HTTP_201_CREATED) # success
更新
正如@Gorgine在评论中提到的那样,文档不建议处理atomic
内部的错误。由于遵循建议总是一个好主意,因此可以将atomic
放在try
块中。在这种情况下,如果发生错误,atomic
块将处理回滚,因此您将需要处理atomic
块中except
不会回滚的操作。像这样:
try:
with transaction.atomic():
# do your stuff
user_dict = do_user_actions(query_kwargs=query_kwargs,permission_code=permission_code)
1/0 # error
except SomeError: # capture error
revert_user_actions() # revert do_user_actions
return Response(status=status.HTTP_424_FAILED_DEPENDENCY) # failure
return Response(serializer.data,status=status.HTTP_201_CREATED) # success
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。