TIL

23/12/01 TIL __ 트랜잭션 2. LOCKS

GABOJOK 2023. 12. 1. 23:41

 

지난번 트랜젝션이 도대체 어떤것인지에 대해 알아보았다. 

이번에는 트랜젝션을 어떻게 사용할 것인지 좀더 자세히 알아보겠다. 

 

🚗   LOCK

 

  • 락(Lock)은 동시성을 제어하기 위해 사용하는 기능이다.
  • 해당하는 데이터를 점유하여 다른 트랜잭션의 접근을 막아 동시성과 일관성의 균형을 맞추기 위해 사용

 

 

1.  shared Locks, Read Locks (공유락, 읽기락)

  • read전용 락.
  • 다른 트랜젝션이 데이터 읽는거 허용, 그러나 수정하는건 금지.
  • 이 락을 사용하는 트랜잭션이 모든 작업을 수행했다면 공유락은 해제
  • 즉 작업이 끝나면 공유락 해제
# 트랜잭션을 시작합니다.
START TRANSACTION;

# SPARTA 테이블을 조회할 때, 해당 데이터들에 공유 락을 설정합니다.
SELECT * FROM SPARTA LOCK IN SHARE MODE;

 

 

2. Exclusive Locks 베타락, WRITE Locks 쓰기락 __ 수정작업

  • 특정 트랜잭션이 데이터를 읽거나 수정하는 동안 다른 트랜잭션은 접근할 수 없게 하는 락.
  • 다른 트랜젝션이 데이터를 읽거나 수정하는것 금지.
  • write 전용 락. 트랜잭션이 해당하는 데이터 점유하고 있으면다른 트랜잭션이 접근 못하도록.
# 트랜잭션을 시작합니다.
START TRANSACTION;

# SPARTA 테이블을 조회할 때, 해당 데이터들에 배타 락을 설정합니다.
SELECT * FROM SPARTA FOR UPDATE;

 

 

 

🐣  락킹 수준(Locking Level)

 

 

1.  글로벌 락(Global Locks) , 데이터베이스 락(Database Locks)

  • 다른 트랜잭션들 모든테이블 접근 금지
  • 데이터베이스의 모든 테이블에 락을 걸어서
  • 현재 트랜잭션을 제외한 나머지 트랜잭션들이 모든 테이블을 사용할 수 없도록 
  • 가장 높은 수준의 락을 가지고 있으며, 가장 큰 범위를 가지고 있다.
# 글로벌 락을 획득합니다.
# MySQL 서버에 존재하는 모든 테이블에 락을 겁니다.
FLUSH TABLES WITH READ LOCK;

 

 

https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html

 

MySQL :: MySQL 8.0 Reference Manual :: 15.7.1 InnoDB Locking

MySQL 8.0 Reference Manual  /  ...  /  The InnoDB Storage Engine  /  InnoDB Locking and Transaction Model  /  InnoDB Locking This section describes lock types used by InnoDB. Shared and Exclusive Locks InnoDB implements standard row-level locking w

dev.mysql.com

 

2. 테이블 락(Table Locks)

  • 자주 안쓴다고 한다.
  • 다른 사용자가 작업중인 테이블을 동시에 수정하지 못하도록 합니다.
  • 해당 테이블에 대한 접근 막음.
  • 작업 끝난후 해제
# SPARTA 테이블에 테이블 락을 설정합니다.
LOCK TABLES SPARTA READ;

 

https://dev.mysql.com/doc/refman/8.0/en/innodb-locking.html

 

MySQL :: MySQL 8.0 Reference Manual :: 15.7.1 InnoDB Locking

MySQL 8.0 Reference Manual  /  ...  /  The InnoDB Storage Engine  /  InnoDB Locking and Transaction Model  /  InnoDB Locking This section describes lock types used by InnoDB. Shared and Exclusive Locks InnoDB implements standard row-level locking w

dev.mysql.com

 

 

 

3. 네임드 락(Named Locks)

  • 테이블이나 테이블의 행과같은 DB 오브젝트가 아닌, 특정한 문자열점유.
  • 특정 데이터베이스 객체에 이름을 지정하여 해당 객체에 락(Lock)을 설정하는 방법을 말한다.
  • 그니깐 락인데 이름이 있음. 명시적으로 이름 부여
  • 다른 트랜젝션에서 동일한 이름쓴다? 그럼 바로 접근 금지! 및 관리
  • 데이터베이스 전체에서 사용 가능. 테이블 뿐만 아니라
  • 수동으로 해제해야함. 그러기 전까지 트랜젝션들 해당 소스에 접근 못함.
# sparta_name 문자열을 획득합니다.
# 만약, 10초 동안 획득 하지 못한다면, NULL을 반환합니다.
SELECT GET_LOCK('sparta_name', 10);

 

https://dev.mysql.com/doc/refman/8.0/en/locking-functions.html

 

MySQL :: MySQL 8.0 Reference Manual :: 12.14 Locking Functions

This section describes functions used to manipulate user-level locks. Table 12.19 Locking Functions GET_LOCK(str,timeout) Tries to obtain a lock with a name given by the string str, using a timeout of timeout seconds. A negative timeout value means infin

dev.mysql.com

 

 

 

4. 메타데이터 락(Metadata Locks)

  • 가장 많이 쓰임.
  • 메타데이터에 대한 접근 관리 (테이블구조, 인덱스, 권한 등)
  • 다른 사용자가 작업중인 테이블의 동일한 행 및 동일한 데이터베이스의 객체를 동시에 수정하지 못하도록 한다.
  • 즉 동시에 동일한거 수정 못하도록.
  • 데이터베이스 구조나 스키마를 변경하는 작업을 수행할 때도 사용.
  • 메타데이터 락은 테이블 락보다 더 큰 범위를 가지며,
  • 데이터베이스의 메타데이터에 대한 접근을 제한하고 변경하는 작업을 수행할 때 사용된다.
  • 특정 테이블에 대한 작업이 아닌 데이터베이스 전체에 영향을 미친다.
# 테이블 구조를 변경할 때, MySQL은 내부적으로 메타데이터 락을 설정합니다.
ALTER TABLE SPARTA ADD COLUMN Age Int;

 

 

https://dev.mysql.com/doc/refman/8.0/en/metadata-locking.html

 

MySQL :: MySQL 8.0 Reference Manual :: 8.11.4 Metadata Locking

MySQL uses metadata locking to manage concurrent access to database objects and to ensure data consistency. Metadata locking applies not just to tables, but also to schemas, stored programs (procedures, functions, triggers, scheduled events), tablespaces,

dev.mysql.com

 

 

이처럼 락은 다양한 락킹 수준을 가지고 있다.

만약 락설정을 잘못하게 된다면, 모든 api가 동작하지 않는 "교착상태(Dead Lock)" 이 발생하여, 

프로그램이 멈춰버리는 문제가 발생할 수 있다. 

 

 

🦋   교착상태(Dead Lock)

여러 테이블에 락(Lock)을 적용하여, 다른 작업이 처리되지 못하게 점유하고 있는 작업이 있을 때, 

다른 작업을 끝나는 것을 무한정 기다리는것을 나타낸다.

 

 

 

이를 해결하기 위해 락에 대한 구성을 잘 고려해야한다고 한다.

이부분은 실제로 코드를 작성해봐야 이해가 더 잘 될꺼 같다. 

일단은 이런 락이 있구나 정도로 넘어간다.