在JDBC中使用postgres锁定表

时间:2013-03-29 19:04:35

标签: java postgresql jdbc transactions locking

关于使用JDBC锁定postgres数据库中的表的快速问题。我有一个表,我想为其添加一个新记录,但是,为了对主键执行此操作,我使用递增的整数值。

我希望能够在Java中检索此列的最大值,并将其存储为变量,以便在添加新行时用作新的主键。

这给我一个小问题,因为这将被建模为多用户系统,当2个位置请求相同的最大值时会发生什么?在尝试添加相同的主键时,这当然会产生问题。

我意识到我应该在桌面上使用EXCLUSIVE锁来防止在获取密钥和添加新行时读取或写入。但是,我似乎无法找到任何方法来处理JDBC中的表锁定,只是标准事务。

psuedo代码:

primaryKey = "SELECT MAX(id) FROM table1;";
primary key++;
//id retrieved again from 2nd source

"INSERT INTO table1 (primaryKey, value 1, value 2);"

1 个答案:

答案 0 :(得分:5)

你是绝对正确的,如果两个地点几乎同时请求,你将遇到竞争条件。

处理此问题的方法是在postgres中创建sequence并选择nextval作为主键。

我不确切知道您前进的方向以及处理数据的方式,但您也可以将列设置为serial,甚至不在插入查询中包含该列。该列将自动自动递增。