0

我有两个应用程序。一个是 OrderService,另一个是 TradeService。在贸易服务中,有一种交易方法“购买”。

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

问题描述:

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

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

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

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

  5. 但是在 Load 方法中它给出了延迟初始化异常:会话已关闭。(两个应用程序共享同一个数据库)

  6. 对此的可能解决方案是使 Submit Order 方法具有事务性。

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

    • 死锁的原因,A. Buy 方法锁定 Id 为“xyz”的订单对象。并发送相同的 ID 提交订单方法。B. 现在 Buy 方法正在等待提交订单的回复。C. Submit Order 方法无法加载 order 对象,因为它已经被 buy 方法锁定。D. 所以提交订单方法正在等待获取锁。因此它是死锁条件。

注意:这两个应用程序都使用 Spring MVC、Spring Web Service 和 Hibernate。

请帮助我摆脱这种情况。提前致谢。(如果需要,我可以发布部分代码)

4

2 回答 2

0

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

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

您需要做的是,打开一个事务,然后先将实体附加到该事务。

于 2011-04-15T10:03:13.340 回答
0

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

是的,这两种服务都应该是事务性的。您收到 LazyInitializationException 是因为您的 load 方法可能会进行 2 次单独的数据库调用来构建 Order 实例,并且会话在第一次数据库调用后关闭。

于 2011-05-12T01:22:55.593 回答