DB 동시성 제어 & 교착상태
DB : 동시성 제어
1. 트랜잭션1이 데이터a를 갱신 2. 트랜잭션2가 데이터a를 갱신 결국 트랜잭션1의 갱신 결과는 무효화되고 데이터a는 트랜잭션2의 결과로 덮혀씌워진다.1. 트랜잭션1이 데이터a를 읽음 // 1 2. 트랜잭션2가 데이터a를 2로 갱신 하고 commit함 // 2 3. 트랜잭션3이 데이터a를 읽음 // 2 트랜잭션 1과 3이 읽은 데이터a의 값이 서로 다르다(불일치)1. 트랜잭션1이 데이터a를 갱신하고 있음 2. 트랜잭션2가 갱신되는 데이터a를 읽고 작업을 수행한 뒤 commit 3. 트랜잭션1이 비정상 종료되어 rollback 트랜잭션2는 결과적으로 잘못된 데이터a로 작업을 수행했지만 commit되었기 때문에 rollback하지 못한다.1. 트랜잭션1이 데이터 a,b,c를 sum하고 있음 //예상 결과 : a+b+c 2. 트랜잭션2가 데이터b를 k로 update 3. 트랜잭션1이 sum 연산을 마침 // 실제 결과 : a+k+c1. 트랜잭션1이 데이터a를 갱신함 2. 트랜잭션2가 "갱신된 데이터a"를 읽음 3. 트랜잭션1이 rollback되어 갱신이 무효화됨 트랜잭션2는 무효화된 "갱신된 데이터a"를 가지게 된다.1. 트랜잭션1이 데이터a를 읽음 -> "데이터a : 1" 2. 트랜잭션2가 데이터a를 갱신함 -> "데이터a : 2" 3. 트랜잭션1이 다시 데이터a를 읽음 -> "데이터a : 2" // 이전 결과와 다르다1. 트랜잭션1이 where 구문으로 특정 범위의 데이터를 읽음 -> "데이터a : 1" 2. 트랜잭션2가 데이터b를 추가함 3. 트랜잭션1이 다시 특정 범위의 데이터를 읽음 -> "데이터a : 1, 데이터b : 2" // phatom data 등장!START TRANSACTION; -- transaction id : 1 SELECT * FROM Member WHERE name='hjoon'; START TRANSACTION; -- transaction id : 2 SELECT * FROM Member WHERE name = 'hjoon'; UPDATE Member SET name = 'top' WHERE name = 'hjoon'; COMMIT; UPDATE Member SET name = 'sun' WHERE name = 'hjoon'; -- 0 row(s) affected COMMIT;
DB : Lock
DB : Blocking
DB : Dead Lock
DB Blocking vs DB Dead Lock
DB Blocking
DB Dead Lock
Last updated