金融其它

对查询结果进行锁定和更新的问题

各位专家,本人开发Java程序时遇到一个问题:假设我的Java程序需要读取表T中的状态字段为0的一条记录,假设为R1,并更新其状态字段为1。会执行两段sql:selsct id from t where sts = 0 ;                    &...显示全部
各位专家,本人开发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();收起
参与5

查看其它 3 个回答kkchat的回答

kkchatkkchat数据库管理员IBM
用你说的"select语句后加上 with RR 或 USE AND KEEP UPDATE LOCKS 或 FOR UPDATE" 就可以实现,在这两句sql执行之间的空隙,其他客户端或程序是更新不了R1记录的,因为R1记录已经被你的这个事务锁住了,但是能读取R1记录 。
系统集成 · 2013-01-28
浏览596

回答者

kkchat
数据库管理员IBM
擅长领域: 数据库

kkchat 最近回答过的问题

回答状态

  • 发布时间:2013-01-28
  • 关注会员:1 人
  • 回答浏览:596
  • X社区推广