Hibernate,Spring Web Service事务问题

时间:2011-04-15 05:35:44

标签: hibernate spring spring-mvc spring-ws hibernate-annotations

我有两个申请。一个是OrderService,另一个是TradeService。 在交易服务中,有一种方法'买'是交易性的。

当Trade Service使用Web服务调用Order服务的SubmitOrder方法时会出现问题。

问题描述:

  1. Buy方法中的所有步骤都在一个交易中。

  2. 当我们调用buy方法时,它会创建一个Order Object。

  3. 当此方法使用Web服务调用Submit Order方法时,它会传递订单ID。

  4. 提交订单方法使用此ID从DB加载订单对象。

  5. 但是在Load方法中它给出了Lazy Initialization Exception:Session已关闭。 (两个应用程序共享相同的数据库)

  6. 可能的解决方法是使提交订单方法成为交易。

  7. 导致另一个死锁问题。

    • 死锁的原因, A.购买方法锁定订单对象,ID为'xyz'。并发送相同的Id以提交订单方法。 B.现在购买方法正在等待提交订单的回复。 C.提交订单方法无法加载订单对象,因为它已被buy方法锁定。 D.因此提交订单方法正在等待获取锁定。因此它处于死锁状态。
  8. 注意:两个应用程序都使用Spring MVC,Spring Web Service和Hibernate。

    请帮助我摆脱这种情况。在此先感谢。(如果需要,我可以发布部分代码)

2 个答案:

答案 0 :(得分:0)

通常,无法在Web服务调用的两端使用相同的数据库事务。 - 通过Web服务传输连接至少是不可能的。

所以你必须接受这样一个事实:你有/需要两个数据库事务。每边一个。 - 除此之外(导致您的Lazy Initialization Exception),如果Web服务 - 服务器端重新接收实体,它不会附加到任何会话,因此如果您尝试访问尚未加载(layz加载)属性然后得到这个layz加载例外。

您需要做的是,先打开一个交易,然后将实体首先附加到此交易中。

答案 1 :(得分:0)

为什么TradeService会创建订单?我希望这是OrderService的责任。这样就不会争用相同的资源。

是的,这两项服务都应该是交易性的。您将获得LazyInitializationException,因为您的load方法可能需要进行2次单独的数据库调用来构建Order实例,并且在第一次数据库调用后会话已关闭。