我正在使用MySQL开发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做到这一点?
答案 0 :(得分:1)
这取决于您正在处理的环境。对于容器管理的事务,容器管理您的事务,您所要做的就是将Lockmode设置为lockmode.write。这样做是因为它在用户A访问记录1时阻止对类方法的所有写访问。另一方面,对于独立应用程序,您只需向方法添加同步关键字即可控制并发访问。我希望这会有所帮助。
答案 1 :(得分:1)
对于MySQL,您可以使用SELECT FOR UPDATE
语句来锁定记录。在事务完成或回滚之前,锁不会被释放。
更多相同的here。
答案 2 :(得分:0)
并非每个数据库都支持按记录锁定。
通常,如果您在EE环境中,可以使用JPA EntityManager#find()方法锁定某些记录。
完全使用就像那样
// EntityManager em;
YourClass obj = em.find(YourClass.class, primaryKey, LockModeType.WRITE);
// do something
em.merge(obj);
事务提交后,记录将被释放。
在非EE环境中,正如Darshan Mehta所说,connection.createStatement().execute("SELECT * FROM table FOR UPDATE")
将是解决方案。