我们的应用主要使用Hibernate的版本控制支持进行乐观锁定。我们计划在一个特定场景中实现悲观锁定。我对悲观锁定没有多少经验,所以请原谅这个问题听起来天真。
当用户显示更新条目的意图时 - 我们使用“select for update”锁定相应的DB行。现在,如果这个用户花了很长时间提交他的更改是在锁定后忘记它,我们如何使用一些超时/回滚机制解锁此锁?因此,该行不会长时间保持锁定状态,并且禁止所有其他用户编辑它。
我怀疑这是否会在我们正在使用的Weblogic-JTA-Spring事务处理机制中处理 - 我们已经有30分钟的事务超时。 (??)
那么,是否应该直接在Oracle级别处理此回滚。如果是,那怎么样?请告知最佳处理方法,以便这种锁不会长时间徘徊。
答案 0 :(得分:2)
只有在交易结束时才会释放锁定。当向数据库发出显式commit
或rollback
或终止数据库会话(执行隐式rollback
)时,事务将结束。如果您的中间层已经设置为回滚任何打开超过30分钟的事务,那么释放锁就足够了。
但是,如果您在Weblogic应用程序服务器中运行Java应用程序,那么悲观锁定是不合适的。首先,我假设您在中间层使用连接池。如果是这种情况,那么连接池中的一个数据库连接将需要由中间层保持交易的长度(在这种情况下最多30分钟)。但是允许一个会话长时间保持打开特定数据库会话会破坏建立连接池的目的。通常,几十个(如果不是数百个)应用程序会话可以从连接池共享一个连接 - 如果您要允许悲观锁定,那么现在您正在强制应用程序会话与这些会话的数据库会话之间建立1:1的关系。 / p>
答案 1 :(得分:0)
有很多情况下乐观锁定不能取代悲观锁定。锁定超时在数据库中处理。请参阅此页面,了解如何在Oracle中配置它