Spring JPA删除顺序异常:先删Page再删Site仍触发外键约束错误
为什么先删关联Page再删Site仍触发外键约束错误?
事务未正确绑定
如果删除Page和Site的操作不在同一个数据库事务里,就会出现时间窗口漏洞:删完Page后,可能有其他请求或线程趁机插入了关联该Site的新Page,等你去删Site时,数据库里已经又有了关联数据,直接触发外键约束。另外,就算在同一个事务里,要是没确保Page的删除操作先提交到数据库就执行Site删除,也会因为数据库里还残留关联数据报错。Page查询范围不全
你用来获取该Site下所有Page的查询逻辑可能有问题:比如加了多余的过滤条件(只查了状态为启用的Page)、关联字段写错了,或者用了错误的查询方式,导致部分关联的Page没被查到,自然也没被删除。数据库里剩下的这些漏网Page,就是触发外键约束的元凶。JPA缓存未清理
JPA的EntityManager一级缓存里可能还存着旧的Page实例,这些实例依然持有Site的引用。哪怕数据库里的Page已经删干净了,缓存里的对象会让JPA误以为还有关联关系,进而在删除Site时抛出错误。这种情况可以在删完Page后调用entityManager.clear()清理缓存,再执行Site删除。数据库约束检查时机问题
像PostgreSQL这类数据库,默认是即时检查外键约束,而不是等到事务结束再统一校验。如果同一个事务里,Page的删除操作没立即生效(比如批量删除语句执行失败),也会导致删Site时触发约束错误。
内容的提问来源于stack exchange,提问作者Mira
相关产品推荐
相关产品推荐

