2011-04-19 56 views
0

我的应用程序调用了跨2个JVM集群的服务器。 这些请求可以发送到任一服务器。 我使用Spring与Hibernate进行数据库调用(对于DB2数据库)。 但是,我注意到Hibernate之间没有自动锁定机制。我确实通过类似于 - query.setLockMode(“myBo”,LockMode.UPGRADE)来实现锁定机制;但是这似乎并不适用于JVM。在JVM上使用hibernate的问题

问题场景:

首先JVM从表1(代替用LockMode.UPGRADE)选择用于更新的数据。在第一个JVM完成更新之前,第二个JVM也会从Table1中选择数据(这不应该发生)。第一个JVM成功完成更新。但是第二个JVM出现DuplicateKeyException失败(更新发生在Table1的索引键上)。

有人可以请建议一个解决方案吗?

感谢 拉迪卡

+0

用'LockMode.UPGRADE'做第二个事务选择数据吗?第二笔交易是否选择与第一笔交易相同的数据? – axtavt 2011-04-19 14:10:16

回答

1

这是不相关的,你有几个JVM上的事实。您可以在同一个JVM上使用两个并发线程的相同场景,因为Hibernate根本不会执行任何锁定。如果需要锁定,则使用乐观锁定(使用版本属性),或在数据库中使用锁定(使用LockMode.UPGRADE)。

但是这两种锁定机制都会导致异常情况:一旦有多个并行事务处理相同的数据,它们是不可避免的。考虑到这一点,您必须设计您的应用程序(即出现错误消息,实施重试机制等)。

+0

感谢您的回复。由于Hibernate Locking没有起作用,所以必须为并发数据访问实现一些错误/异常处理逻辑。 – Radhika 2011-04-19 20:20:17