공부/Database

공부/Database

MySql의 last_insert_id() 함수는 동시성 문제로부터 안전할까?

배경 프로젝트에서 쿼리 개선을 위해 JdbcTemplate를 통해 bulk insert를 구현하게 되었다. 우리는 MySql의 기본키 전략 중 Identity를 사용하고 있어 JPA의 saveAll 메서드로는 bulk insert가 되지 않기 때문이다. 그런데 bulk insert 해야 할 엔티티가 하나가 아니고, 해당 엔티티의 Id를 FK로 가지는 엔티티도 bulk insert해주어야 하는 상황이었다. 따라서 첫 번째 bulk insert의 결과인 Id들을 얻어와야 했고, 그 방법으로 last_insert_id() 함수를 사용할 수 있었다. insert를 한 뒤, Id를 조회해 계산하는 아이디어 자체는 이전에도 생각했다. 하지만 가장 최근 Id를 조회한다면, 의존하는 엔티티의 저장을 마치기 전까지는 테..

공부/Database

Lock을 활용한 Concurrency Control 기법

Youtube 쉬운 코드 채널의 영상을 보고 정리한 내용입니다. https://youtu.be/0PScmeO3Fig?si=mP1V2HZCoZni1sSt Lock의 종류 read-lock (shared lock) read할 때 사용한다. 다른 트랜잭션이 read 하는 것은 허용한다. write-lock (exclusive lock) read/write할 때 사용한다. 다른 트랜잭션이 같은 데이터를 read/write하는 것을 모두 허용하지 않는다. ❗️ write lock이라고 해서, write할 때만 사용되는 것은 아니다! exclusive한 형태라는 점이 중요하다. lock 호환성 같은 데이터에 대해서, 한 트랜잭션이 어떤 lock을 가지고 있을 때, 다른 트랜잭션도 lock을 동시에 가질 수 있을까?..

공부/Database

Transaction 격리가 되지 않을 때 발생할 수 있는 현상들

Youtube 쉬운 코드 채널의 영상을 보고 정리한 내용입니다. https://youtu.be/bLLarZTrebU?si=cQAeGZoEVi9tN5MT SQL 표준 비판 아래와 같은 세 가지 이상 현상과 isolation level은 SQL 표준(standard SQL 92)에서 정의된 내용이다. Dirty read Non-Repeatable read / Fuzzy read Phantom read 격리 수준을 이용해, 위와 같은 이상 현상들이 모두 발생하지 않게 만들 수는 있다. 하지만 그러면 제약 사항이 많아져서 동시에 처리 가능한 트랜잭션 수가 줄어들어 DB의 처리량(throughput)이 하락하는 문제가 생길 수 있다. 그래서, 필요에 따라 일부는 허용할 수 있도록 Isolation 레벨을 나누게 ..

공부/Database

동시성 제어(Concurrency Control) 기초 (2) Recoverability

쉬운 코드 채널의 Youtube 영상을 보고 정리한 내용입니다. (2부) concurrency control 기초 : recoverability. 트랜잭션들이 동시에 실행될 때 rollback이 발생하면 어떤 일이 벌어질까요? Unrecoverable Schedule 회복 불가능한 형태의 schedule로, DBMS는 이런 schedule을 허용하지 않는다. 여러 트랜잭션으로 이루어진 schedule에 대해 특정 트랜잭션을 롤백할 때, 다른 트랜잭션은 롤백할 수 없는 경우를 말한다. 예를 들어 k가 h에게 20만원 이체 할 때, h도 자기 계좌에 30만원을 입금하려고 할 때 아래와 같은 순서로 트랜잭션이 수행된다고 하자. (1) T1. k의 계좌 잔액을 읽는 작업 (k_balance -> 100만원) (..

공부/Database

동시성 제어(Concurrency Control) 기초 (1) Schedule과 Serializability

쉬운 코드 채널의 Youtube 영상을 보고 정리한 내용입니다. (1부) concurrency control 기초 : schedule과 serializability. 트랜잭션들이 동시에 실행될 때 isolation을 보장하는 기초 이론 Schedule 여러 transaction들이 동시에 실행될 때 각 transaction에 속한 operation들의 실행 순서 여러 transaction들이 동시에 실행된다면, 시간적 순서를 일종의 '줄'이라고 했을 때 서로 다른 transaction에 속한 operation(예를 들면 한 transaction 내의 쓰기 작업)이 섞여서 줄 서 있을 수 있다. 이렇게 여러 transaction들이 동시에 실행될 때, 각 operation이 어떤 순서로 실행되는지를 설명하..

공부/Database

[Real MySQL 8.0] 05. 트랜잭션과 잠금 (2) MySQL의 격리 수준

MySQL의 격리 수준 (Isolation level) 트랜잭션의 격리 수준이란? 여러 트랜잭션이 동시에 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회하는 데이터를 볼 수 있게 허용할지 말지를 결정하는 것이다. DIRTY READ NON-REPEATABLE READ PHANTOM READ READ UNCOMMITED 발생 발생 발생 READ COMMITTED 없음 발생 발생 REPEATABLE READ 없음 없음 발생 (InnoDB는 없음) SERIALIZABLE 없음 없음 없음 위 표와 같이 크게 4가지의 격리 수준으로 나뉜다. 격리 수준은 (표의 순서 기준으로) 아래로 갈수록, 다음과 같은 성격을 가지는 것이 일반적이다. 데이터 격리(고립) 정도가 높아진다. 동시 처리 성능도 떨어진다..

공부/Database

[Real MySQL 8.0] 05. 트랜잭션과 잠금 (1) 트랜잭션, MySQL의 잠금

[Real MySQL 8.0]을 읽으며 정리한 내용입니다. 💭 부분 은 좀 더 공부가 필요하거나, 생각해보고 싶은 내용들 ~ 트랜잭션 InnoDB vs MyISAM InnoDB 엔진으로 만든 테이블과 MyISAM 엔진으로 만든 테이블에 트랜잭션 동작을 비교해보자. MyISAM 엔진에서는 부분 업데이트가 발생할 수 있다. 이는 테이블 데이터의 정합성을 맞추는 데 어려움을 준다. 각 테이블에 fdpk 컬럼 값이 3인 레코드를 저장해두고 아래 쿼리를 각각 실행해 중복 키 오류를 발생시켜보자. SET autocommit=ON; INSERT INTO tab_myisam (fdpk) VALUES (1),(2),(3); // MyISAM 테이블에는 1, 2 레코드가 남아있다. INSERT INTO tab_innodb..

d02
'공부/Database' 카테고리의 글 목록