如何使用Java锁定数据库记录?

7

我正在使用Java和dbf开发一个数据库程序。 我需要知道如何从Java端锁定数据库记录。

例如,我们有一个数据库表cheques,其中有5条记录(从record 15)。有2个用户,user-1user-2user-1访问record 1,而user-2同时尝试访问record 1。 我想锁定record 1,以防止user-2user-1访问时访问该记录。 如何在Java中实现这一点?


1
MySQL会为您处理争用问题:http://dev.mysql.com/doc/refman/5.0/en/internal-locking.html 这是使用关系型数据库而不是自己编写数据存储的优势之一。您遇到了什么问题? - Shafik Yaghmour
MySQL会为您完成这项工作。 - JHS
只有在MySQL内置锁不足时才需要这样的锁定。请指定您是通过JDBC、JPA还是其他方式访问数据库? - rootkit
我的访问方法是sun.jdbc.odbc.JdbcOdbcDriver。我的要求是,当用户-1正在访问记录1时,如果用户-2尝试访问它,我需要从我的Java Swing应用程序中通知用户-2。 - Mahesh
3个回答

4
在MySQL中,您可以使用SELECT FOR UPDATE语句锁定记录。锁定将在事务完成或回滚之前不会释放。 更多相关信息请参见此处

我该怎么做?请给我建议,因为我是这个论坛的新手。 - Mahesh
在答案左侧,您会看到一个钩标记按钮。只需单击它,它将填充绿色。以下链接演示了相同的步骤: http://stackoverflow.com/help/accepted-answer - Darshan Mehta

1

并非所有的数据库都支持按记录进行锁定。

通常情况下,在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")将是解决方案。


1

这取决于您所使用的环境。对于容器管理的事务,容器会为您管理事务,您只需要将锁模式设置为lockmode.write。这样做的作用是,在用户A访问记录1时,它会阻止对类方法的所有写访问。另一方面,对于独立应用程序,您可以在方法中添加Synchronization关键字来控制并发访问。希望这能帮到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接