【问题标题】:Thread deadlock blocked on Hibernate transaction在休眠事务上阻塞线程死锁
【发布时间】:2009-12-18 19:40:30
【问题描述】:

我有一个进程创建一个数据库实体,然后启动第二个进程。然后它等待第二个进程在完成其处理之前找到并更新数据库实体,从而提交数据库实体。问题似乎在于,由于执行实体创建的初始进程在第二个进程尝试查找实体(它找不到)时尚未提交数据库实体,因此第一个进程永远不会完成,因为第二个进程无法完成,事情就被搞砸了。

一些上下文:第一个进程创建一个实体,在外部机器上启动第二个进程,并将实体状态设置为已启动。外部机器上的第二个进程调用 Web 服务,该 Web 服务找到实体并将实体的状态更新为 READY。第一个进程有一个循环来检查实体的状态,一旦它从 STARTED 更改为 READY ,它就会进行额外的处理并完成。然而,第二个进程永远无法找到实体(我认为),因为它永远不会从 Hibernate 会话中提交,它是在第一个进程中创建的,而在第二个进程尝试查找实体时尚未完成。

有什么更好的方法可以避免这种事情发生?有没有办法在启动第二个进程之前中途提交事务,以便让实体存在于数据库中以供第二个进程查找?

感谢您的建议等。

【问题讨论】:

    标签: hibernate transactions multithreading deadlock


    【解决方案1】:

    Hibernate 会话甚至不是线程安全的,更不用说在这种情况下幸存下来了。您需要为单个线程的单个工作单元使用会话,在这种情况下,您有三个 - 创建对象,无论其他进程在做什么,然后在最后更新对象。您需要为所有三个使用(并刷新)单独的会话。

    【讨论】:

    • 我在原始实体创建后刷新,但访问数据库的两个进程之间不共享同一个会话,并且似乎直到第一个进程的事务完成之前实体不会持久化并且可用于第二个进程。
    • 这就是您所期望的交易,不是吗?
    • 我的意思是,在事务提交之前,实体在事务之外是不可见的(除非您相应地调整事务隔离级别)。您必须在第 3 步的第 1 步之后提交。
    猜你喜欢
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-13
    相关资源
    最近更新 更多