Archive

Posts Tagged ‘table lock’

lock에 관한 자료

December 20, 2007 Leave a comment

 

DB type이 MyISAM Type이면 insert, update등을 할때마다 LOCK이 발생.
myisam의 경우 insert, update시 자동 lock이 되므로 select되는 부분만 read lock을 걸어줘도 충분.
(데이터 무결성이 정확히 보장되어야 한다면 “스토리지 엔진을 InnorDB를 쓰고 트랜잭션을 사용”도 참고)

 

mysql의 기본 테이블 타입인 myisam의 table 단위의 lock과,
oracle, ms-sql의 row 단위 lock의 장단점.

    • table단위 lock은 쓰기작업시 table 전체를 잠그기 때문에
      다른사람이 그 table에 접근하기 위해 대기를 해야하는것.
    • row단위 lock은 해당 row를 제외한 다른 row 들도 쓰기, 읽기가 가능.
    • row단위의 lock은 table단위 lock보다 어떤 row가 어떤 락 상태인지 파악하므로
      리소스를 더 쓸 수 있으며, 그에따른 오버헤드도 발생할 수 있다.

     

    기본적인 Lock의 개념

      • Lock설정은 특정 Table을 사용하고 있는 상황에서 다른 접속자의 접근 차단하는 기능을 한다.
      • Read Lock을 걸면 다른 사용자는 해당 Table에 읽기만 할 수 있다.
      • Write Lock을 걸면 다른 사용자는 Table에 전혀 접근 할 수 없다.

       

      LOCK TABLES tab_name READ
      현재 client 이외의 client들은 tab_name이란 테이블에 READ를 못한다는 즉, SELECT를 못한다는 것.

      LOCK TABLES tab_name WRITE
      현재 client 만이 WRITE 즉, INSERT, DELETE 등을 할 수 있다는 것.
      WRITE Lock을 걸면, 자동으로 READ lock 까지 걸린다.

       

      Example
      lock tables AAA write;
      insert …
      unlock tables;

      Tags: ,

      Table lock

      December 20, 2007 Leave a comment


      User가 INSERT, DELETE, UDATE, SELECT .. FROM .. FOR UPDATE OF 문장을 실행하면,
      변경되는 ROW에 대한 ROW LOCK과 TABLE에 대한 TABLE LOCK이 발생.

      ROW LOCK (TX)
      INSERT INTO … VALUE.. ;,
      DELETE FROM …WHERE …;,
      UPDATE ..SET ..WHERE ..;,
      SELECT .. FROM .. WHERE .. FOR UPDATE OF.. ; 등의 SQL 문장에서,
      WHERE 조건에 해당되는 ROW에 대하여 다른 유저들이 변경할 수 없도록 EXCLUSIVE LOCK 이 생긴다.
      TX LOCK이 걸린 ROW는 DML 문장을 실행한 유저가 COMMIT이나 ROLLBACK을 할때 까지 걸리므로
      다른 유저들이 변경할 수 없다.

      TABLE LOCK (TM)
      TX LOCK이 걸린 ROW가 저장된 TABLE에 대한 LOCK 이다.
      DML SQL 문장을 수행하는 중에,
      해당 테이블이 ALTER 나 DROP 되는 것을 방지하기 위해서 TM LOCK을 사용한다.
      같은 테이블에서 실행할 수 있는 SQL 문장과 실행할 수 없는 SQL 문장을 구분하기 위해서다.
      TM LOCK에는 RS(ROW SHARE), RX(ROW EXCLUSIVE), S(SHARE), SRX(SHARE ROW EXCLUSIVE), X(EXCLUSIVE) 가 있다.

       

      RS : ROW SHARE LOCK
      table에 lock을 걸려는 transaction이 table안에 lock된 row가 있고
      그 row를 변경시키고자 하는 것을 가리킨다.

      SELECT .. FROM .. WHERE .. FOR UPDATE OF .. ; 이나
      LOCK TABLE .. IN ROW SHARE MODE; 명령에 의해 해당 테이블에는 RS LOCK 이 생긴다.
      RS LOCK 이 걸린 테이블에는 RS, RX, S, SRX LOCK 을 걸 수 있고, X LOCK 은 걸 수 없다.

      단, SELECT .. FROM FOR UPDATE OF 명령에 의해 WHERE 조건에 걸린 ROW 에 대해서는
      TX LOCK 이 생기므로 이 ROW 에 대해서 UPDATE, DELETE 를 실행할때는 테이블에 대해서는
      RX LOCK이 생기므로 에러는 안 나지만, COMMIT 이나 ROLLBACK 할때까지 WAITING 을 한다.

      SELECT .. FOR UPDATE OF; 문장은 테이블에는 RS LOCK 이므로 에러는 안나지만,
      ROW 에 대해서는 TX LOCK 이 걸리므로 WAITING 한다.

       

      RX : ROW EXCLUSIVE LOCK
      lock이 걸린transaction이 그 table에 있는 row들에 대해
      하나 이상의 update를 수행하고자 하는 것을 가리킨다.

      UPDATE ..;, INSERT INTO ..;, DELETE FROM ..; 이나
      LOCK .. IN ROW EXCLUSIVE MODE ; 명령에 의해 테이블에 걸리는 LOCK 이다.
      RX LOCK 도 RS LOCK 과 비슷한 내용이고, 단지 S, SRX, X LOCK 을 걸 수 없다.

       

      S : SHARE LOCK
      Transaction에 의해서 걸리는 share table lock은 다른 transaction들이
      단지, table에 대한 query, SELECT … FOR UPDATE를 이용한 특정 row에 대한
      lock, LOCK TABLE … IN SHARE MODE문들을 성공적으로 수행하기 위해서 허용한다.

      LOCK .. IN SHARE MODE; 에 의해 테이블에 생긴 LOCK 이다.
      S LOCK 은 같은 테이블에 대해서 RS, S LOCK 만 가능하고, RX, SRX, X LOCK 을 걸 수는 없다.
      SQL> LOCK TABLE EMP IN SHARE MODE;

       

      SRX : SHARE ROW EXCLUSIVE
      한 시점에 주어진 table에 대해 하나의 share row exclusive table lock만이 걸릴 수 있다.
      transaction에 의해 걸린 share row exclusive table lock은
      다른 transaction이 query을 하거나 SELECT … FOR UPDATE로
      특정 row를 lock하는 것을 허용하나 table의 갱신은 허용하지 않는다.

      LOCK TABLE .. IN SHARE ROW EXCLUSIVE MODE; 에 의해 테이블에 생긴 LOCK 이다.
      SRX LOCK 은 같은 테이블에 대해서 RS LOCK 만 가능하고 RX, SRX, S, X, LOCK 을 걸 수 없다.
      SQL> LOCK TABLE 사원 IN SHARE ROW EXCLUSIVE MODE;

       

      X : EXCLUSIVE
      lock을 건 transaction이 table에 대한 access를 exclusive write로 허용하는
      table lock의 가장 제한적인모드

      LOCK TABLE .. IN EXCLUSIVE MODE; 에 의해 테이블에 생긴 LOCK 이다.
      X LOCK 은 같은 테이블에서는 어떠한 LOCK 도 걸 수 없다.
      즉, DROP TABLE ..;, ALTER TABLE ..; 등의 DDL 문장에 의해 테이블에 생기는 LOCK 이다.

      Insert와 Select 분리에 대한 생각

      December 20, 2007 1 comment

      1.동일 database내의 동일 Table구조

      { Database – Table }
      • 열(row)단위의 insert와 select 작업이 동시에 일어나는 경우 table lock으로 인한 “처리 속도저하”등의 부하가 일어날 수 있는다.
      • table lock이란?

      2.서로 다른 database내의 서로 다른 databse 구조

      { Database A – Table a } insert용도
      { Database B – Table b } select용도
      • 위의 경우도 [Database B - Table b]를 사용할때 [Database A - Table a]에서 해당 데이터가 넘어오기때문에
        insert와 select의 중복현상은 마찬가지로 일어난다.
      • 열(row)단위의로 작업이 이루어지는 구조를 바꾼다.
      • 지속적인 [Database B - Table b]의 select 사용이 있을때,
        [Database B - Table b]에 채워질 데이터(select용 데이터)를 cron등을 사용하여
        일정 시간에 한번씩 [Database A - Table a]에서 가져와 바꾼다.
      • 실시간 처리는?