Java Hibernate多对多连接表中的死锁

Java Hibernate多对多连接表中的死锁,java,hibernate,hibernate-mapping,Java,Hibernate,Hibernate Mapping,我正在开发一个企业应用程序,其中我们使用Hibernate和一个连接表的多对多关系。我们在生产中看到非常零星的数据库死锁(高容量),我们无法重新创建 Category.java public class Category { .... private Set<Product> products = new HashSet<Product>(); ... } 问题是,我们在多台服务器上同时创建了许多产品,所有这些产品都是针对同一类别的 当我们看到死

我正在开发一个企业应用程序,其中我们使用Hibernate和一个连接表的多对多关系。我们在生产中看到非常零星的数据库死锁(高容量),我们无法重新创建

Category.java

public class Category {
    ....
    private Set<Product> products = new HashSet<Product>();
    ...
}
问题是,我们在多台服务器上同时创建了许多产品,所有这些产品都是针对同一类别的

当我们看到死锁时,
updatecategory
调用不可避免地涉及其中。我们需要防止执行这些
updatecategory
SQL语句

选项1:是否有任何方法可以调用Session.saveOrUpdate(category)并使其不更新category(因为它没有更改),但仍然可以插入到联接表category\u PRODUCT\u ASSC中

选项2:如果不是,我们已经考虑过通过JDBC直接插入CATEGORY_PRODUCT_ASSC行。但是,一个问题是缓存中过时的Hibernate对象(类别对象)。关于这种可能的方法有什么想法/建议吗


非常感谢您的帮助。:-)

我们解决了这个问题。事实证明,这确实是
updatecategory
语句。我们没有使用
CATEGORY\u PRODUCT\u ASSC
表作为多对多关系的连接,而是创建了一个Hibernate托管实体来表示这个连接表<代码>类别ProductAssc

通过这种方式,我们可以直接持久化关系,而不必调用Category实例对象上的
Session.saveOrUpdate
,唯一目的是在Category对象上没有任何更改时获取
Category\u PRODUCT\u ASSC
联接表中的插入


我创建了Cactus测试,它可以同时执行20次,测试新旧代码,我们的DBA监视并看到旧代码的并发性,而新代码的并发性则没有

您正在使用hibernate的事务吗?您如何知道
updatecategory
调用导致死锁?这听起来像是仓促下结论。@matt是的,我们正在使用事务。请相信我,这不是一个仓促的结论,但“我们已经为此奋斗了数周,没有确定的消息,这是我们最好的线索。”不幸的是,我不确定
更新类别
呼叫是否导致了僵局。我们捕获异常并设置回滚。我们有多个Web服务器和服务服务器,并通过JMS队列和主题进行来回通信。我们的DBA无法获取导致死锁的实际SQL语句,只能获取阻塞的其他SQL语句。他们已报告此更新语句。您正在使用哪个数据库?被阻止的SQL语句在等待什么对象?@matt b我们正在使用Oracle 11g。我们不知道被阻止的SQL语句在等待什么,我们的DBA说他可以看到被阻止的语句(但看不到它们在等待什么)。这就是问题所在。非常感谢您的关注和评论!
<class 
    name="Category"
    table="CATEGORY"
>
    ...
   <!-- uni-directional many-to-many association to Product -->
   <set
       name="products"
       table="CATEGORY_PRODUCT_ASSC"
       lazy="false"
       cascade="none"
    >
        <key column="CATEGORY_ID" />
        <many-to-many class="Product" column="PRODUCT_ID" />
    </set>
</class> 
update CATEGORY set NAME=?, DESCRIPTION=?, where category_id=?
insert into CATEGORY_PRODUCT_ASSC (CATEGORY_ID, PRODUCT_ID) values (?, ?)