Django数据库save操作无法永久保存更新,求排查原因
解决方案与排查方向
1. 事务未提交或隐性回滚(最可能原因)
Django默认在请求结束时自动提交事务,但如果代码处于@transaction.atomic事务块中,或项目开启了ATOMIC_REQUESTS=True(每个请求作为原子事务),只要请求流程中存在未被捕获的隐性异常(哪怕是后续代码的小错误),整个事务会被自动回滚,导致更新丢失。
- 验证方法:在
save()后手动提交事务,测试是否生效:from django.db import transaction p_details.save(update_fields=["build_status", "build_error"]) transaction.commit() # 手动提交 - 排查动作:查看Django日志,确认请求全程无异常抛出;在代码关键节点添加日志,确认所有逻辑都执行完毕。
2. 数据库连接不一致
检查Django配置的数据库与DBeaver连接的是否为同一库(比如是否混淆了测试库/生产库,或不同schema),这是容易忽略的低级问题。
3. 事务隔离级别导致的可见性差异
PostgreSQL默认隔离级别为READ COMMITTED,未提交的事务变更仅对当前数据库连接可见。调试器中能看到变更是因为和更新操作复用了同一个连接,而DBeaver是独立连接,只有事务提交后才能看到。如果请求结束后仍看不到,说明事务未被提交而是回滚了。
4. ORM缓存干扰(可能性低)
虽然objects.get()默认查询数据库,但如果之前有过同主键的查询,ORM可能复用缓存。可以用以下方式强制查询数据库:
new_p = ProjectDetails.objects.select_for_update().get(pk=res['id']) # 或刷新已有实例 p_details.refresh_from_db()
内容的提问来源于stack exchange,提问作者thecoder
相关产品推荐
相关产品推荐

