django的api接口事务执行顺序的解析
事务在api中的流程

遇到问题(创建了数据,使用其他线程,立马查询, 需要等api结束后才会真提交事务

解决方法: 使用on_commit注册事务提交后的回调
多线程
from django.db import transaction
transaction.on_commit(lambda: self._start_query_thread(log.id))
celery在数据库事务结束时触发任务
Django 的一个常见陷阱是立即触发任务,而不是等到 数据库事务的结束,这意味着 Celery 任务可能会运行 在所有更改都保存到数据库之前。例如:
views.py
def create_user(request):
# Note: simplified example, use a form to validate input
user = User.objects.create(username=request.POST['username'])
send_email.delay(user.pk)
return HttpResponse('User created')
# task.py
@shared_task
def send_email(user_pk):
user = User.objects.get(pk=user_pk)
# send email ...
在这种情况下,任务可能会在视图提交之前开始 事务添加到数据库,因此 Task 可能无法找到 用户。send_email
一个常见的解决方案是使用 Django 的 on_commit 钩子来触发任务 提交事务后:
- send_email.delay(user.pk)
+ transaction.on_commit(lambda: send_email.delay(user.pk))
在 5.4 版本中添加。
由于这是一种常见的模式,Celery 5.4 为此引入了一个方便的快捷方式, 使用 .您应该调用 ,而不是调用 :
- send_email.delay(user.pk)
+ send_email.delay_on_commit(user.pk)