我正在用 dbf 用 Java 开发一个数据库程序。我需要知道如何从 Java 端锁定数据库记录。
示例:我们有一个数据库表,表中cheques
有 5 条记录(record 1
通过5
)。有 2 个用户,user-1
和user-2
. user-1
同时访问record 1
和user-2
尝试访问record 1
。我想锁定record 1
以防止在访问该记录user-2
时user-1
访问它。我如何在 Java 中做到这一点?
在 MySQL 的情况下,您可以使用SELECT FOR UPDATE
语句来锁定记录。在事务完成或回滚之前,不会释放锁。更多关于相同的here。
这取决于您工作的环境。对于容器管理的事务,您的容器会为您管理事务,您所要做的就是将 Lockmode 设置为 lockmode.write。这样做的目的是在 userA 访问记录 1 时阻止对类方法的所有写访问。另一方面,对于独立应用程序,您只需将 Synchronization 关键字添加到您的方法中即可控制并发访问。我希望这有帮助。
并非每个数据库都支持按记录锁定。
一般来说,如果你在 EE 环境中,你可以使用 JPA EntityManager#find()方法来锁定某些记录。
完全使用会这样
// EntityManager em;
YourClass obj = em.find(YourClass.class, primaryKey, LockModeType.WRITE);
// do something
em.merge(obj);
事务提交后,记录将被释放。
正如 Darshan Mehta 所说,在非 EE 环境中,这connection.createStatement().execute("SELECT * FROM table FOR UPDATE")
将是解决方案。