在JDBC中使用postgres锁定表

Mat*_*att 4 java postgresql locking transactions jdbc

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

我希望能够在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);"
Run Code Online (Sandbox Code Playgroud)

Tre*_*ama 5

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

处理此问题的方法是在postgres中创建一个序列,并选择nextval作为主键.

我不确切知道你的方向以及你如何处理数据,但你也可以将列设置为序列,甚至不包括插入查询中的列.该列将自动自动递增.