LockUtil

表结构

create table MY_LOCK
(
  ID    NUMBER(11) not null,
  KEY   VARCHAR2(50),
  DESC  VARCHAR2(100)
);

代码实现

	public interface LockHandle{
		boolean handle(Connection conn);
	}
	
	/**
	 * 获取锁(不等待)
	 * @param key 唯一key
	 * @return 成功返回Connection(autoCommit=false) 失败null 
	 */
	public static Connection getLock(String key){
		 String sql = "select 1 from my_lock where key = ? for update nowait";
		 try{
			 Connection conn = JDBC.getConnection();
			 conn.setAutoCommit(false);
			 int ret = JDBC.execute(sql, new Object[]{key}, conn);
			 if(ret == 1){
				 return conn;
			 }else{
				 if(ret == 0){
					 log.info("getLock can not find key={}", key);
				 }else{					 
					 log.info("getLock fail key={}", key);
				 }
				 JDBC.rollback(conn);
				 JDBC.close(conn);
			 }
		 }catch(SQLException e){
			 log.info("getLock fail key={}", key);
		 }
		 return null;
	}
	
	public static void getLockAndHandle(String key, LockHandle handle){
		Connection conn = LockUtil.getLock(key);
		try{
			if(conn == null){//获取不到锁
				return;
			}
			handle.handle(conn);
			JDBC.commit(conn);
		}catch(Exception e){
			JDBC.rollback(conn);
			log.error("getLockAndHandle error", e);
		}finally{
			JDBC.close(conn);
		}
	}
	
	/**
	 * 获取锁(等待)
	 * @param key 唯一key
	 * @return 成功返回Connection(autoCommit=false) 失败null 
	 */
	public static Connection getLockWait(String key){
		 String sql = "select 1 from my_lock where key = ? for update";
		 try{
			 Connection conn = JDBC.getConnection();
			 conn.setAutoCommit(false);
			 int ret = JDBC.execute(sql, new Object[]{key}, conn);
			 if(ret == 1){
				 return conn;
			 }else{
				 if(ret == 0){
					 log.info("getLockWait can not find key={}", key);
				 }else{					 
					 log.info("getLockWait fail key={}", key);
				 }
				 JDBC.rollback(conn);
				 JDBC.close(conn);
			 }
		 }catch(SQLException e){
			 log.info("getLockWait fail key={}", key);
		 }
		 return null;
	}

转载于:https://my.oschina.net/jackruan/blog/719800

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值