Background Image
Java
2009.12.30 02:50

SELECT ~ FOR UPDATE 대체 방법

조회 수 32377 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

소개: DBMS에서 SELECT 문을 통해 row level lock을 거는 방법으로 사용되는 SELECT ~ FOR UPDATE 구문이 CUBRID에는 존재하지 않는다. 이를 대체하는 방법으로 CUBRID 확장 JDBC APIsetWriteLock를 소개한다.

적용 대상: CUBRID2008R1.x 이상, JDK1.5이상

 

SELECT ~ FOR UPDATE 대체 방법

DBMS에서 SELECT 문을 통해 특정 row lock을 거는 문장으로 사용되는 것이 SELECT ~ FOR UPDATE 구문이다. 사용 예는 아래와 같다.

SELECT * FROM code where s_name=’X’ FOR UPDATE;

CUBRID에서는 위 구문을 지원하지 않는다. 이를 대체하기 위해서 CUBRID 확장 JDBC API setWriteLock를 제공하고 있다.

구문은

void setWriteLock()

CUBRIDOID 클래스에 포함된 메소드 이다.

setWriteLock 예제

아래는 setWriteLock을 사용하는 예제로 code 테이블의 s_name‘X’ row를 조회하면서 쓰기 잠금을 설정한 후 해당 row f_name‘XXX’ update 시키는 예제이다.

import java.sql.*;

import cubrid.sql.*;              //1

public class TestWriteLock1{

  public static void main(String arg[]) throws Exception {

    Connection conn = null;

    PreparedStatement  ps = null;

    ResultSet rs = null;

    try {

      Class.forName("cubrid.jdbc.driver.CUBRIDDriver");

      conn = DriverManager.getConnection("jdbc:cubrid:localhost:39000:demodb:::","","");

      conn.setAutoCommit(false);          //2

      Object result = null;

      String sbQuery = "SELECT class(a), a.* FROM code a WHERE a.s_name=?";                            //3

      String s_name = "X";

      String f_name = "XXX";

      ps = conn.prepareStatement(sbQuery);

      ps.setString(1, s_name);

      rs = ps.executeQuery();

      if(rs.next()) {

        result = rs.getObject(1);             //4

        CUBRIDOID oid = (CUBRIDOID)result;          //5

        oid.setWriteLock();     //6

        if(ps != null) ps.close();

        ps = conn.prepareStatement("UPDATE code SET f_name = ? WHERE CLASS(code) = ?");         //7

        ps.setString(1, f_name);

        ps.setObject(2, result);               //8

        ps.executeUpdate();

      }

      if(rs != null) rs.close();

      if(ps != null) ps.close();

      conn.commit();

    }catch ( SQLException e ) {

      conn.rollback();

      e.printStackTrace();

    } catch(Exception e) {

      conn.rollback();

      e.printStackTrace();

    } finally {

      if(rs != null) rs.close();

      if(ps != null) ps.close();

      if(conn != null) conn.close();

    }

  }

}

·      1 : setWriteLock CUBRIDOID의 메소드로 CUBRIDOID를 사용하기 위해서는 cubrid.sql.* import 해야한다.

·      2 : 동일 트랜잭션 내에서 select update를 수행하여야 하므로 autoCommit false로 설정한다.

·      3 : 해당 row OID를 가져오기 위해서는 SELECT 문에 class(table_name) 형식으로 명시해준다. 위 예제는 code 테이블의 alias a로 부여 하였기 때문에 class(a)와 같이 명시 하였다.

·      4, 5 : 조회된 OID getObject() 를 사용하여 Object 형태로 받은 후, CUBRIDOID로 형변환을 수행한다.

·      6 : CUBRIDOID.setWriteLock()를 호출하여 해당 row를 쓰기 잠금 설정한다.

·      7 : 쓰기 잠금 설정된 row의 데이터를 update하기 위해서 비교 조건으로 위에서 받아온 OID를 사용한다. OID를 조회 조건으로 사용하기 위해서는 class(table_name) 형식으로 명시해준다.

·      8 : OID 값을 해당 위치에 바인딩 하기 위해서는 setObject()를 사용한다.

 


List of Articles
번호 분류 제목 글쓴이 날짜 조회 수
106 Linux CUBRID DB와 Broker 분리방안 정만영 2010.04.28 28412
105 기타 데이터 저장 구조와 테이블 재구성 file 손승일 2010.04.21 37490
104 기타 CUBRID 복제 구성하기 - 단일 서버에 구성 방법 포함 남재우 2010.03.08 30003
103 Windows 윈도우즈 환경에서 배치화일을 이용하여 백업 또는 데이터베이스 정리 수행하기 남재우 2010.03.03 27485
102 Linux CUBRID 복제 설계 가이드 file 정만영 2010.03.03 25139
101 Linux CUBRID 사용 포트와 iptables(방화벽) 설정 정만영 2010.03.01 38341
100 기타 자동증가 속성 사용 방법 및 주의 사항 남재우 2010.02.26 35684
99 기타 CUBRID 관련 유용한 기술 자료... 정병주 2010.02.19 33462
98 기타 Server HA 구성 시 CUBRID 설정과 방법 정만영 2010.02.03 21185
97 ODBC/OLEDB Vista_IIS_CUBRID_ASP연동 janus 2010.01.31 24553
96 Install CUBRID2008 R2.1 업그레이드시 serial 관련 문제 해결 방법 남재우 2010.01.28 27348
95 기타 CUBRID 데이터베이스와 연동하여 Qt어플리케이션 개발하기 - 2 3 김대진 2010.01.27 24541
94 기타 CUBRID 데이터베이스와 연동하여 Qt어플리케이션 개발하기 - 1 김대진 2010.01.14 32878
93 기타 CUBRID인덱스 구성 전략 웁쓰 2009.12.31 22193
92 기타 조인 방법(Join Method) 설명 file 웁쓰 2009.12.31 27994
91 기타 스칼라 서브쿼리 사용 가이드 웁쓰 2009.12.31 28274
90 Install CUBRID 에 텍스트큐브 설치하기 file inureyes 2009.12.31 29852
89 기타 예제로 배우는 CUBRID 스터디 문학청년 2009.12.29 18552
88 기타 독자적 테이블 사용되는 복제 재구성 file 손승일 2009.12.30 24173
» Java SELECT ~ FOR UPDATE 대체 방법 손승일 2009.12.30 32377
Board Pagination Prev 1 2 3 4 5 6 7 8 9 Next
/ 9

Contact Cubrid

대표전화 070-4077-2110 / 기술문의 070-4077-2113 / 영업문의 070-4077-2112 / Email. contact_at_cubrid.com
Contact Sales