[CUBRID] Lock 발생시킨 후 잠금 상태 확인
·
DBMS/CUBRID
필요한 테이블 생성먼저 아래의 테이블과 데이터 생성CREATE TABLE tbl(id INT PRIMARY KEY, a INT);INSERT INTO tbl VALUES (10, 10);INSERT INTO tbl VALUES (20, 20);INSERT INTO tbl VALUES (40, 40);COMMIT; S_LOCK9.3 버전에서 진행트랜잭션 격리 수준이 REPEATABLE READ로 설정되어 있지 않다면 설정 (격리 수준이 READ COMMITTED인 경우, 트랜잭션이 commit 되기 전이더라도 특정 객체에 대한 읽기가 완료되면 해당 객체에 대해 획득한 S_LOCK을 해제하기 때문에 변경)csql에 접속해서 autocommit 끄기csql> ;autocommit offcsql> SET TRA..
[CUBRID] 잠금과 교착 상태
·
DBMS/CUBRID
잠금의 종류공유 잠금(shared lock, S_LOCK)트랜잭션 Tx1이 읽기 연산을 수행하기 전에 해당 객체에 대해 획득하는 잠금다른 트랜잭션들은 Tx1이 읽는 객체에 대해 쓰기 연산은 수행할 수 없음, 읽기는 가능여러 트랜잭션이 동일 객체에 대해 잠금을 획득할 수 있음격리 수준이 READ COMMITTED인 경우, 트랜잭션 Tx1이 commit 되기 전이더라도 특정 객체에 대한 읽기가 완료되면 해당 객체에 대해 획득한 S_LOCK을 해제 -> 반복 불가능한 읽기가 발생할 수도 있음격리 수준이 REPEATABLE READ 또는 SERIALIZABLE인 경우, 트랜잭션 Tx1이 commit 될 때까지 S_LOCK을 유지 -> 반복 불가능한 읽기가 발생하지 않음MVCC 프로토콜을 사용하는 10버전부터는 ..
[CUBRID] 트랜잭션과 격리 수준
·
DBMS/CUBRID
트랜잭션 처리커밋과 롤백트랜잭션에서 수행되는 여러 연산을 모두 반영하는 것은 commit, 모두 취소하는 것은 rollback커밋은 사용자 필요에 따라 발생, 롤백은 사용자의 필요와 시스템에 의해 발생트랜잭션 관리동시에 수행되는 트랜잭션 사이에서 리소스 관리를 위해 잠금 관리 기법을 사용 잠금 관리: 트랜잭션 Tx1이 갱신 중인 데이터에 트랜잭션 Tx2가 접근하려는 경우, 트랜잭션 Tx1이 사용을 종료할 때까지 트랜잭션 Tx2가 대기하도록 Tx1에게 잠금을 제공하는 것 잠금 보유자(lock holder): 잠금을 획득, 여기서는 Tx1 잠금 대기자(lock waiter): 잠금이 해제될 때까지 대기, 여기서는 Tx2 교착 상태(deadlock): 여러 개의 트랜잭션이 동시에 수행되면서 서로 데이터 갱신을..
[CUBRID] 자바로 연동하기 (일괄 입력 & 브로커 페일오버 설정)
·
DBMS/CUBRID
일괄 입력▪ 많은 데이터를 한꺼번에 입력하려면 loaddb 유틸리티를 이용 -> 온라인에서는 사용할 수 없지만, 큐브리드에서 가장 빠르게 데이터를 입력하는 방법  ▪ 다른 방법으로는 여러 개의 레코드를 한 번에 입력하도록 질의를 작성하고 실행▪ 해당 방식은 입력할 데이터를 반복해서 문자열로 만들어야하고, 브로커 CAS에서 큰 크기의 INSERT 구문을 해석해야함INSERT INTO code (s_name, f_name) VALUES ('W', 'Woman'), ('M', 'Man') ▪ JDBC의 배치 API와 Prepared Statement를 사용하면 개별 실행보다 입력 성능을 크게 높일 수 있음▪ prepareStatement()를 실행한 후 addBatch()를 사용해 데이터를 레코드 단위로 입력..
[CUBRID] 자바로 연동하기 (INSERT/UPDATE/DELETE/REPLACE)
·
DBMS/CUBRID
INSERT/UPDATE/DELETE▪ 연속된 변경을 하나의 트랜잭션으로 처리하려면, 자동 커밋을 끄고 질의를 실행▪ 수동 커밋 모드의 경우 한 트랜잭션이 다른 트랜잭션의 종료를 대기해야만 하는 잠금 대기(lock waiting)가 발생할 수 있으므로 주의해서 커밋/롤백하기conn = DriverManager.getConnection(jdbcUrl);conn.setAutoCommit(false); ▪ SELECT 질의는 executeQuery()를 실행해 ResultSet를 받음▪ INSERT/UPDATE/DELETE는 executeUpdate()를 이용하고 결과로 변경된 레코드 개수를 반환String sql = "UPDATE athlete SET event='Volleyball' " ..
[CUBRID] 자바로 연동하기 (PreparedStatement 사용)
·
DBMS/CUBRID
PreparedStatement 사용큐브리드의 질의 실행 절차▪ 큐브리드 질의의 단계는 컴파일 -> 실행 계획 수립 -> 질의 실행▪ 질의가 브로커의 CAS 프로세스에 전달되면, 브로커는 질의를 해석(컴파일)해서 질의 파스 트리(parse tree)를 기준으로 실행 계획을 세움 ▪ 서버는 질의 실행 계획을 기반으로 질의를 실행▪ 큐브리드는 질의 실행 계획 캐시를 제공하므로, 같은 쿼리에 대해 매번 실행 계획을 세우지 않아도 됨▪ 이를 위해서 질의와 파라미터를 구분하여 코드를 작성해야하는데, 이때 PreparedStatement 클래스를 이용 PreparedStatement를 사용한 코드▪ 파라미터가 매번 달라지는 유형의 질의는 PreparedStatement를 활용하면, 컴파일 및 실행 계획 수립 단계가..
[CUBRID] 자바로 연동하기 (데이터베이스 연결 및 데이터 조회)
·
DBMS/CUBRID
데이터베이스 연결 및 데이터 조회JDBC 드라이버 로드▪ Class.forName()은 자바 클래스 로더에서 큐브리드 JDBC 드라이버를 메모리로 읽어오는 메서드▪ "cubrid.jdbc.driver.CUBRIDDriver"는 큐브리드 JDBC 드라이버의 클래스 경로Class.forName("cubrid.jdbc.driver.CUBRIDDriver");데이터베이스 연결▪ DriverManger를 이용해 JDBC URL에 지정한 데이터베이스에 연결하고 연결 객체를 반환받음▪ charset 파라미터를 통해 연결하려는 데이터베이스의 문자 집합을 JDBC 드라이버가 인식 -> 해당 파라미터 값을 잘못 지정하면 멀티바이트 문자가 깨진 문자로 출력됨String jdbcUrl = "jdbc:cubrid:[호스트 주소..
[CUBRID] 큐브리드 java 연동하기 (intelliJ)
·
DBMS/CUBRID
JDBC의 이해▪ 응용프로그램을 만들면서 DBMS에 연결하기 위해 사용하는 API가 DBMS마다 다르면, 다른 DBMS로 변경할 경우 코드를 새로 작성해야하는 문제가 생김▪ java에서는 JDBC(Java Database Connectivity)라는 표준 데이터베이스 연결 인터페이스를 제공▪ JDBC API를 이용해서 개발하면 다른 DBMS로 변경해도, 코드를 변경할 필요가 거의 없음 ▪ DBMS 개발사들은 이 인터페이스 규약에 맞게 JDBC 드라이버를 제공▪ JDBC 프로그램을 작성하려면 DBMS 개발사가 제공한 JDBC 드라이버를 다운로드해서 사용 JDBC 드라이버 버전 확인▪ 큐브리드 버전에 맞는 JDBC 드라이버를 사용해야함 ▪ 'cubrid_rel' 명령어로 현재 설치된 큐브리드의 버전을 확인해..