如何从Java代码编写乐观和悲观锁定

Posted

技术标签:

【中文标题】如何从Java代码编写乐观和悲观锁定【英文标题】:How to code optimistic and pessimistic locking from java code 【发布时间】:2012-01-31 06:39:56 【问题描述】:

我知道乐观锁和悲观锁是什么,但是当你写一个java代码时你是怎么做的呢?假设我在 Java 中使用 Oracle,我在 JDBC 中是否有任何方法可以帮助我做到这一点?我将如何配置这个东西?任何指针将不胜感激。

【问题讨论】:

Java 锁定和 JDBC 与您所寻找的方式无关。您要解决的问题是什么? Java 锁是可重入锁,可以通过使用“同步”关键字获得。那么,您到底在寻找什么? 我正在寻找数据库锁定 【参考方案1】:

您可以通过这种方式在您的 DB 表中实现乐观锁(这就是在 Hibernate 中完成乐观锁的方式):

    将整数“版本”列添加到您的表中。 每更新对应的行,就增加该列的值。 要获得锁,只需读取行的“版本”值。 在 where 子句中添加“version = getting_version”条件 您的更新声明。更新后验证受影响的行数。 如果没有行受到影响 - 有人已经修改了您的条目。

你的更新应该是这样的

UPDATE mytable SET name = 'Andy', version = 3 WHERE id = 1 and version = 2

当然,这种机制只有在各方都遵循它的情况下才有效,这与 DBMS 提供的不需要特殊处理的锁相反。

希望这会有所帮助。

【讨论】:

【参考方案2】:

假设我在 Java 中使用 Oracle,我在 JDBC 中是否有任何方法可以帮助我做到这一点?

This Oracle paper 应该会为您提供一些有关如何执行此操作的提示。

没有特定的 JDBC 方法。相反,您可以通过设计 SQL 查询/更新以及放置事务边界的位置来实现乐观锁定。

【讨论】:

以上是关于如何从Java代码编写乐观和悲观锁定的主要内容,如果未能解决你的问题,请参考以下文章

乐观锁悲观锁

乐观与悲观锁定

使用 EntityManager 在实体上设置悲观锁定

悲观锁和乐观锁

数据库乐观锁和悲观锁的理解和实现

Oracle数据库悲观锁与乐观锁详解