表结构
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;
}