我正在使用Java和dbf开发一个数据库程序。 我需要知道如何从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中实现这一点?
我正在使用Java和dbf开发一个数据库程序。 我需要知道如何从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中实现这一点?
SELECT FOR UPDATE
语句锁定记录。锁定将在事务完成或回滚之前不会释放。
更多相关信息请参见此处。并非所有的数据库都支持按记录进行锁定。
通常情况下,在EE环境中,您可以使用JPA EntityManager#find() 方法来锁定特定记录。
完整用法如下:
// EntityManager em;
YourClass obj = em.find(YourClass.class, primaryKey, LockModeType.WRITE);
// do something
em.merge(obj);
提交事务后,记录将被释放。
在非企业版环境中,正如Darshan Mehta所说,connection.createStatement().execute("SELECT * FROM table FOR UPDATE")
将是解决方案。
这取决于您所使用的环境。对于容器管理的事务,容器会为您管理事务,您只需要将锁模式设置为lockmode.write。这样做的作用是,在用户A访问记录1时,它会阻止对类方法的所有写访问。另一方面,对于独立应用程序,您可以在方法中添加Synchronization关键字来控制并发访问。希望这能帮到您。