我有以下代码用于从表中读取值然后递增它然后在表中输入递增的值。此代码用于LAN项目并且位于servlet中。因此,当并发客户端访问此servlet时,他们会同时读取该值,从而同时递增该值,然后在表中输入值,然后会有多行具有相同值的值,我不会# 39;不要。我可以通过为表中的变量赋予唯一属性来避免它,但随后将在数据库中运行单独的进程。所以,我想从客户端本身避免这种情况,所以我正在考虑同步语句对象。我正在寻找有关这个问题的建议。
System.out.println("1");
Db mydata=(Db)getServletContext().getAttribute("Database");
conn=mydata.getCon();
System.out.println("2");
stmn=conn.createStatement();
System.out.println("3");
synchronised(stmn)
{
rst=stmn.executeQuery("select max(pregno) from regt");
while(rst.next())
{
rg=rst.getString(1);
}
reg=Integer.parseInt(rg);
reg++;
System.out.print(reg);
stmn.execute("insert into regt values('"+reg+"')");
}
答案 0 :(得分:0)
正如@Robert,@ Turophile和@Alex Poole所说,处理这个问题的正确方法是一个序列:
CREATE SEQUENCE pregno NOCACHE START WITH 1;
您的Java代码只需从序列中选择以获得更高的数字:
SELECT pregno.nextval FROM DUAL;
如果出于某些原因这不是一个选项,请至少将代码从SELECT MAX(regno)
和INSERT
更改为SELECT regno FOR UPDATE
和UPDATE regno
对......