✎NHN Academy | JAVA

NHN Academy - 2024.10.11(Fri)

박순돌 2024. 10. 14. 11:16

ACID   =   원자성(Atomicity), 일관성(Consistency), 신뢰성(Reliability), 격리(Isolation)

 

운영체제에서 동시접근을 해결하기 위해 사용하는 해결책! 병행성 제어(Concurrency Control)

mutex / 세마포어 

 

트랜잭션 특성

  1. Access Mode : UNSPECIFIED, READ ONLY, READ/WRITE

  2. Diagnostics-size : 기록할 수 있는 오류 조건의 수

  3. Isolation Level : 동시에 실행되고 있는 다른 트랜잭션의 작업들에 대해 주어진 트랜잭션이 노출되는 정도를 제어

 

잠금에서 발생하는 문제   1. 성능 문제  2. DeadLock 문제

 

DeadLock : 우선순위 방식으로 해결(운영체제 방식)  /  BUT, 데이터베이스 방식에서는 해결할 수 X

 

FUZZY Read : 같은 데이터를 한 Transaction 에서 읽었음에도 불구하고 값이 달라지는 현상

Phantom Read : 1개의 Transaction 에서 같은 조건으로 2번 읽었는데 2번의 결과가 다른 현상 / 없던 데이터가 생기는 현상

REPEATABLE READ : 트랜잭션이 시작되고 최초 한 번 조회한 값은 트랜잭션이 종료되기 전까지 같은 값이 조회되는 격리 현상

DIRTY READ : 어떤 트랜잭션에서 처리한 작업이 완료되지 않았는데도 다른 트랜잭션에서 볼 수 있는 현상 / 커밋 안 된 변화를 읽는 현상

 

데베 중에 트랜잭션 성능이 가장 좋은 거? 오라클

 

읽기-읽기 문제 : DIRTY READ (Shared Lock - Shared Lock)

읽기-쓰기 문제 : DIRTY READ + REPEATABLE READ (Shared Lock + ?)

쓰기-읽기 문제 : Phantom Read (Exclusive Lock + ?)

 

잠금 모드

Shared Lock Mode(Read Lock - S로 표시)

= 트랜잭션 Ti 가 데이터 객체 A에 Shared Lock을 가지고 있다면 Ti 는 A를 읽을 수 있지만 갱신할 수 없음

Exclusive Lock Mode(Write Lock – X로 표시)

= 트랜잭션 Ti 가 데이터 객체 A에 Exclusive Lock을 가지고 있다면 Ti 는 A를 읽을 수도, 갱신할 수도 없음

 

면접 질문

Strict 2 Phase Lock

가장 널리 사용되는 잠금 규약으로, 두 가지 규칙을 사용

     1. 트랜잭션 T가 어떤 객체를 판독(수정)하려면, 그 객체에 대해 공유(배타적) 잠금을 요청

     2. 트랜잭션이 종료될 때 가지고 있던 모든 잠금을 풀어줌

잠금 규약은 안전한 인터리빙만을 어용함

     두 트랜잭션이 동일한 객체에 접근하며, 한 트랜잭션이 객체를 수정하려 할 때, 단위 작업이 직렬 순서로 수행한 효과를 얻도록 함

 

Isolation Level

- SERIALIZABLE (Level 3) : X(

    : 트랜잭션 T는 완결된 트랜잭션들이 만들어 놓은 변경만 판독

    : T가 판독하거나 기록한 값은 T가 종료된 후에 변경할 수 있음

- REPEATABLE READ (Level 2) : Phantom Read

    : 트랜잭션 T는 완결된 트랜잭션들이 만들어 놓은 변경만 판독

    : T가 판독하거나 기록한 값은 T가 종료된 후에 변경할 수 있으나, Index Locking은 하지 않음

- READ COMMITTED (Level 1) : REPEATABLE READ + Phantom Read

    : 트랜잭션 T는 완결된 트랜잭션들이 만들어 놓은 변경만 판독

    : T가 판독하거나 기록한 값은 T가 종료된 후에 변경할 수 있으나, T가 판독한 Row는 다른 트랜잭션이 접근가능

- READ UNCOMITTED (Level 0) : DIRTY READ + REPEATABLE READ + Phantom Read

    : 트랜잭션 T는 진행중인 트랜잭션이 만들어 놓은 변경도 판독할 수 있음


테이블 잠금 4. SELECT engine, engine_transaction_ID, Thread_ID, Object_schema, object_name, Lock_type, Lock_Mode, Lock_data FROM performance_schema.data_locks;
레코드 잠금 1. SELECT engine, engine_transaction_ID, Thread_ID, Object_schema, object_name, Lock_type, Lock_Mode, Lock_data FROM performance_schema.data_locks; 레코드 잠금 3. SELECT index_name, column_name, cardinality, index_type FROM information_schema.statistics where table_name = 'Passenger';
레코드 잠금 6. SELECT engine, engine_transaction_ID, Thread_ID, Object_schema, object_name, Lock_type, Lock_Mode, Lock_data FROM performance_schema.data_locks; 레코드 잠금 11. SELECT engine, engine_transaction_ID, Thread_ID, Object_schema, object_name, Lock_type, Lock_Mode, Lock_data FROM performance_schema.data_locks WHERE engine_transaction_ID = 4095;
실행중인 트랜잭션 확인 1. SELECT trx_state, trx_tables_in_use, trx_tables_locked FROM information_schema.innodb_trx WHERE trx_mysql_thread_id = connection_id(); 2. SELECT trx_state, trx_tables_in_use, trx_tables_locked FROM information_schema.innodb_trx WHERE trx_mysql_thread_id = connection_id(); 4. SELECT trx_state, trx_tables_in_use, trx_tables_locked FROM information_schema.innodb_trx WHERE trx_mysql_thread_id = connection_id(); 6. SELECT trx_state, trx_tables_in_use, trx_tables_locked FROM information_schema.innodb_trx WHERE trx_mysql_thread_id = connection_id(); 터미널 1에서 잠금 획득 1. SELECT index_name, column_name, cardinality, index_type FROM information_schema.statistics where table_name = 'Passenger';
터미널 1에서 잠금 획득 4. SELECT Object_schema, object_name, Lock_type, Lock_Mode, Lock_data FROM performance_schema.data_locks WHERE engine_transaction_ID = (SELECT trx_id FROM information_schema.innodb_trx WHERE trx_mysql_thread_id = connection_id()); 터미널 2에서 잠금 획득 3. SELECT Object_schema, object_name, Lock_type, Lock_Mode, Lock_data FROM performance_schema.data_locks WHERE engine_transaction_ID = (SELECT trx_id FROM information_schema.innodb_trx WHERE trx_mysql_thread_id = connection_id());
MySQL의 Deadlock detection 4. SELECT Object_schema, object_name, Lock_type, Lock_Mode, Lock_data FROM performance_schema.data_locks WHERE engine_transaction_ID = (SELECT trx_id FROM information_schema.innodb_trx WHERE trx_mysql_thread_id = connection_id()); 7. SELECT Object_schema, object_name, Lock_type, Lock_Mode, Lock_data FROM performance_schema.data_locks WHERE engine_transaction_ID = (SELECT trx_id FROM information_schema.innodb_trx WHERE trx_mysql_thread_id = connection_id()); 11. SELECT Object_schema, object_name, Lock_type, Lock_Mode, Lock_data FROM performance_schema.data_locks WHERE engine_transaction_ID = (SELECT trx_id FROM information_schema.innodb_trx WHERE trx_mysql_thread_id = connection_id());
특수한 잠금기법

 

'✎NHN Academy | JAVA' 카테고리의 다른 글

NHN Academy - 2024.10.16(Wed)  (2) 2024.10.16
NHN Academy - 2024.10.14(Mon)  (3) 2024.10.14
NHN Academy - 2024.10.10(Thu)  (1) 2024.10.11
NHN Academy - 2024.10.08(Tue)  (1) 2024.10.08
NHN Academy - 2024.10.07(Mon)  (1) 2024.10.07