各位专家,本人开发Java程序时遇到一个问题:
假设我的Java程序需要读取表T中的状态字段为0的一条记录,假设为R1,并更新其状态字段为1。
会执行两段sql:selsct id from t where sts = 0 ;
update t set sts = 1 where id = #id#(select 出来的id);
这整个过程必须是原子操作,期间不允许另外的程序读取R1记录,不知道如何实现?
我使用Java JDBC基本方法,把上述两个sql语句放到一个事物中(设置不自动提交,全部执行完在commit),
或者在select语句后加上 with RR 或 USE AND KEEP UPDATE LOCKS 或 FOR UPDATE等,但在两句sql执行
之间的空隙,依然可以通过其他客户端或程序读取或更新表t中对应得记录R1,不知道要怎么做才能保证在两个sql语句
全部执行完并提交之前,其影响的记录被完全锁定,不允许别的程序读取和修改?
请专家指教,非常感谢谢谢!
补充我的Java程序:
Class.forName("com.ibm.db2.jcc.DB2Driver");
Connection con = DriverManager.getConnection("jdbc:db2:dbname",
"aaa", "aaa");
con.setAutoCommit(false);
Statement stmt = con.createStatement();
ResultSet rs = stmt
.executeQuery("select trim(fil_nam) as taskid from pccs.nsy_rep_ctr where fil_sts = 0 fetch first 2 rows only for update with rs");
//表中fil_sts=0的记录只有一条
System.out.println("SSSSSSSSSS");
Thread.sleep(60000);//此时从DB2客户端执行查询语句,依然可以查询到fil_sts=0的记录,并可对该记录进行修改
System.out.println("FFFFFFFFFF");
String taskid = "";
while (rs.next()) {
taskid = rs.getString("taskid");
}
stmt
.executeUpdate("update pccs.nsy_rep_ctr set fil_sts = 1 where fil_nam = '"
+ taskid + "' with rs");
rs.close();
stmt.close();
con.commit();
con.setAutoCommit(true);
con.close();
收起