Java 和 数据库两种方式进行加锁

java方式:

publicstatic synchronized int generate(StringtableName){  
  Stringsql = "select value from t_table_id where table_name=?";  
  Connectionconn = null;  
  PreparedStatementpstmt = null;  
  ResultSetrs = null;  
  intvalue = 0;  
  try{  
    conn= DbUtil.getConnection();  
    pstmt= conn.prepareStatement(sql);  
    pstmt.setString(1,tableName);  
    rs= pstmt.executeQuery();  
    rs.next();  
//                        if(!rs.next()){  
//                                thrownew RuntimeException();  
//                        }  
  value= rs.getInt("value");  
  value++;  
  modifyValueField(conn,tableName,value);  
}catch(Exceptione){  
  e.printStackTrace();  
  thrownew RuntimeException();  
}finally{  
    DbUtil.close(rs);  
    DbUtil.close(pstmt);  
    DbUtil.close(conn);  
}  
  returnvalue;  
}  

 

 

数据库的方式:

//采用悲观锁来实现同步  
//在sql语句后加 for update就加上了锁,在查询的时候进行加锁,在加锁后不能进行查询。提交时候后其他人才能查询。  
public static int generate(String tableName){  
        //使用数据库的悲观锁for update  
        String sql = "select value from t_table_id where table_name=? for update";  
        Connection conn = null;  
        PreparedStatement pstmt = null;  
        ResultSet rs = null;  
        int value = 0;  
        try{  
            conn = DbUtil.getConnection();  
            //设置自动提交为false  
            DbUtil.beginTransaction(conn);  
            pstmt = conn.prepareStatement(sql);  
            pstmt.setString(1, tableName);  
            rs = pstmt.executeQuery();  
            rs.next();  
//          if(!rs.next()){  
//              throw new RuntimeException();  
//          }  
            value = rs.getInt("value");  
            value++;  
            modifyValueField(conn,tableName,value);  
            //提交事务  
            DbUtil.commitTransaction(conn);  
        }catch(Exception e){  
            e.printStackTrace();  
            //回滚事务  
            DbUtil.rollbackTranscation(conn);  
            throw new RuntimeException();  
        }finally{  
            DbUtil.close(rs);  
            DbUtil.close(pstmt);  
            DbUtil.resetConnection(conn);  
            DbUtil.close(conn);  
        }  
        return value;  
    }  

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值