본문 바로가기

기초 지식/DB

(6)
[JPA] 낙관적 Lock, 비관적 Lock 개요 JPA에는 동시에 여러 사용자가 접근하여 데이터를 조작할 때 발생할 수 있는 문제를 다루기 위해 Lock을 지원하고 있습니다. 이 중에 낙관적 Lock(Optimistic Lock), 비관적 Lock(Pessimistic Lock)에 대해서 알아보려 합니다. 낙관적 Lock 낙관적이란 단어에서 알 수 있듯이 데이터 갱신 시 충돌이 발생하는 것을 막는 것이 아닌 충돌이 일어났을 때 처리하는 Lock입니다. @Entity class Book( @Id val bookId: String, val bookName: String, @Version val version: Int ) JPA에서는 위와 같이 Entity에 version 필드를 지정하여 사용합니다. version 값을 통해서 Entity의 변경사항을..
[DB] Transation Isolation Level Transaction 트랜잭션(Transaction)이란, 데이터베이스의 상태를 변화시키기 위해서 수행하는 작업의 단위라고 할 수 있습니다. 여기서 단위라고 하다 보니 정해진 범위가 있을 것 같지만 사용자가 정할 수 있는 범위입니다. 따라서 아래의 트랜잭션의 4가지 특징을 지키는 선 안에서 수행이 되어야 성공적인 트랜잭션의 사용법이라고 할 수 있습니다. 원자성 (Atomicity) 일관성 (Consistency) 독립성 (Isolation) 지속성 (Durability) 하지만 개발을 하다 보면 효율적인 성능을 위해 굳이 다른 트랜잭션에서 데이터 참조를 막을 필요가 없을 수도 있습니다. 아니면, 절대로 참조가 되면 안 되게 설정해야 할 필요가 있겠죠. 그래서 이러한 점을 개발자가 어느 정도는 설정을 해주..
[MyBatis] 마이바티스의 #{}, ${} 차이 ? : 마이바티스에서 #하고 $ 차이 알아요? Me : .....iBatis에서 #으로 썼었나? 저는 마이바티스를 처음 알고 쓴지가 1년 반 정도 된것 같습니다. 근데 정말 아무 생각 없이 쓰다가 최근데 #하고 $의 차이를 아냐는 질문을 듣고 정신이 나가버렸습니다. 질문을 듣자마자 "음..? #{parameter} 이렇게 쓴거 같은데 $도 있었나?" 이렇게 생각이 들고 iBatis에서 $를 쓴거 같기도 하더라구요. 그래서 그냥 버전의 차이 아닌가요?라는 답답한 답변을 해버리고 말았습니다. 1년 반동안 정말 아무 생각도 없이 쓰기만 했네요 ㅎㅎ SELECT ${COLUMN} FROM USER WHERE user_id = #{userId} MyBatis에서 $,#을 사용한 예시입니다. 위의 SQL을 보기전에..
DB의 결합 인덱스에 관해서 분명히 결합인덱스에 포함이 되어있는데 왜 인덱스를 타지 않지??! 최근에 일을 진행하면서 기존 쿼리가 인덱스를 여러개 추가했음에도 인덱스를 사용하지 않고 Table Full Scan을 하는 경우가 발생했습니다. 문제의 원인은 인덱스를 여러개를 충분히 추가해두긴 했지만 결합인덱스에서 우선 설정되지 않은 컬럼으로 조회 조건이 적용되면서 발생한 이슈였습니다. 이번 일로 인해 결합인덱스에 대해 공부가 필요할 것 같아서 간단하게 정리해보겠습니다. 결합인덱스 (Composite Index) 결합인덱스란 복수의 컬럼으로 구성된 인덱스로 복수의 컬럼으로 묶었을 때 데이터 분포도가 좋아지는 경우 사용됩니다. //결합 인덱스 생성 구문 예시 CREATE INDEX idx_composite_index_1 ON Test(id..
[MySQL] Insert 후 PK값 얻어오기 (MyBatis 사용) 임시로 만든 City라는 테이블을 살펴보겠습니다. CITY_ID 가 PK 이면서 AI(auto increment)로 사용하는 입장에서는 다음 id를 쉽게 유추할 수 없습니다. 이 PK 값을 바로 가져와서 insert에 활용하는 등 여러가지 상황이 있을 수 있으니 얻어와보도록 하겠습니다. 이번 예제에서는 MyBatis의 SelectKey를 사용해서 쿼리를 작성합니다. 쿼리 /*keyProperty는 결과값을 넣을 model의 변수명*/ /*order(BEFORE, AFTER)를 통해 Insert 쿼리를 실행 후 가져올지 그 전에 가져올지 정할 수 있다*/ SELECT LAST_INSERT_ID() INSERT INTO USER_INFO ( CITY , COUNTRY_ID , LAST_UPDATE ) VAL..
[Oracle] Partitioned index 오라클 partitioned index에 대해 정리한 글입니다. 1. 파티션 인덱스 인덱스는 데이터베이스 테이블에 있는 데이터를 빨리 찾기 위한 용도의 데이터베이스 객체이며 일종의 색인기술입니다. 테이블에 있는 하나 이상의 컬럼으로 만들어지며 생성되면 인덱스 테이블(index table)을 생성해 관리되게 됩니다. 인덱스도 파티션 테이블과 같이 파티션 인덱스가 존재합니다. 파티션 인덱스는 파티션 유무에 따라 파티션과 비파티션으로 나뉘고 또 Global과 Local로 구분되게 됩니다. 2. 파티션 인덱스 유형 1) Local Partitioned Index / Global Partitioned Index 파티션 테이블에는 파티션키(Partition Key)가 있고 이 키로 테이블이 분할되어 있습니다. 이 ..