我有3个实体类:entityA,entityB,entityC,分别对应数据库中的A,B,C3个表,表C是表B的子表,而表B是表A的子表配置了级联关系:@Cascade({org.hibernate.annotations.CascadeType.ALL,org.hibernate.annotations.CascadeType.DELETE_ORPHAN})
现在我每次修改实体entityA的时候是启动事务,先删除它下面所有的entityB和entityC对象,然后再重新创建下属的entityB和entityC对象,然后调用update(entityA)级联更新。这样操作每次输出的SQL是先insert新创建的entityB和entityC对象,然后update entityA对象,最后delete原来的entityB和entityC对象。问题:一般情况下是正常的,偶尔会出现死锁的情况,查看数据库的trace文件发现是在delete entityB对象时死锁。有经验的大侠们能判断出问题出在哪里吗?
现在我每次修改实体entityA的时候是启动事务,先删除它下面所有的entityB和entityC对象,然后再重新创建下属的entityB和entityC对象,然后调用update(entityA)级联更新。这样操作每次输出的SQL是先insert新创建的entityB和entityC对象,然后update entityA对象,最后delete原来的entityB和entityC对象。问题:一般情况下是正常的,偶尔会出现死锁的情况,查看数据库的trace文件发现是在delete entityB对象时死锁。有经验的大侠们能判断出问题出在哪里吗?
这三个表确实是这样的逻辑关系,构成一个3级的层次关系。
我只需要update实体entityA,下面的两级实体会自动保存,因为是级联更新的。至于是先insert还是先delete都是由hibernate控制的,并不是我自己写的程序执行的SQL。
B表的增删
C表的增删您觉得这里的那个功能需要特殊的事务?
我说了一般的事务是要有的 但你的问题跟事务没太大关系 你只需要注意更新顺序便可以了先更新A 然后再将A放到B和C 顺序就是这样
按照你的说法不要使用级联更新来做?因为我使用的是级联更新,也就不存在先更新A还是B或C,而是只需要更新A,B和C会自动保存到数据库,我们项目组的约定是这种父子关系的表都通过级联来做。
有日志文件:
07-30 08:59:51,017 ERROR (org.hibernate.util.JDBCExceptionReporter:78) - ORA-00060: deadlock detected while waiting for resource07-30 08:59:51,020 ERROR (org.hibernate.event.def.AbstractFlushingEventListener:301) - Could not synchronize database state with session
org.hibernate.exception.LockAcquisitionException: could not delete: [com.zoomlion.pms.perApply.model.PerIndex#4028803a22c665250122c92b7ea6135e]