2009-12-18 84 views
1

我有一个创建数据库实体的进程,然后启动第二个进程。然后等待第二个进程在完成处理之前查找并更新数据库实体,从而提交数据库实体。麻烦似乎是,由于执行实体创建的初始过程在第二个进程试图找到实体(它找不到)时没有提交数据库实体,所以第一个进程永远不会完成,因为第二个进程不能完成,事情就会被抛弃。休眠事务阻塞的线程死锁

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

什么是更好的方法来做到这一点,这样的事情不会发生?是否有办法在第二个进程启动之前的中途提交事务,以便让第二个进程的数据库中存在该实体?

感谢您的建议,等

回答

0

的Hibernate Session,甚至没有线程安全的,更何况是生存这样的事情。您需要为单个线程的单个工作单元使用会话,在这种情况下,您可以创建三个对象,无论其他进程在做什么,然后在最后进行对象更新。您需要使用(并冲洗)所有三个单独的会话。

+0

我在创建原始实体之后刷新,但在访问数据库的两个进程之间没有共享相同的会话,并且似乎直到第一个进程的事务完成,实体不会被持久化并可用于第二个进程。 – 2009-12-18 20:03:43

+0

这就是你所期望的,虽然交易不是吗? – 2009-12-18 20:05:06

+2

我的意思是在事务提交之前,实体在事务外部是不可见的(除非你相应地调整事务隔离级别)。您将不得不在第3步的第1步之后提交。 – 2009-12-18 20:09:40