독도 광고 모금 캠페인

[MYSQL] Table에 Lock 사용하기

Table에 lock을 걸어줌으로써 테이블 작업을 하는 시간동안 Access 등을 막을 수 있기에 그 동안에 일어날 수 있는 PK 변경 등으로 인한 DB구조상의 오류를 사전에 차단할 수 있다.

먼저 테이블을 생성하면서 타입지정이 MyISAM이나 InnoDB로 되어 있어야 한다. 보통은 MyISAM이 기본이지만 고급 트랜잭션 사용을 위해서 InnoDB를 추천한다.

Lock-type으로는 READ와 WRITE가 있다.
READ는 테이블 작업을 수행하는 동안 자신이외에는 읽기만 가능하며 쓰기는 불가능하고, WRITE는 읽기, 쓰기 모두 불가능하다.

락 사용시는

SQL>Lock Tables 테이블네임 Lock-type;

락 해제시에는

SQL>Unlock Tables;


Lock Table시에 작업할 테이블 모두 lock을 걸어줘야 한다.(select, update, insert, delete에 사용되는 테이블 전부)

여러개의 테이블을 Lock 해야 할 경우 ,로 추가 할 수 있다.

SQL>Lock Tables 테이블네임 Lock-type, 테이블네임 Lock-type, 테이블네임 Lock-type;

또한 알리아스된 테이블의 경우도 추가해줘야 한다.
test_table과 test_table t라고 알리아스를 주었을 경우 test_table과 test_table t를 모두 Lock해줘야 한다.

SQL>Lock Tables test_table Lock-type, test_table t Lock-type;

이올린에 북마크하기(0) 이올린에 추천하기(0)
Trackback 0 Comment 2

Trackback : http://deuxism.tistory.com/trackback/2694506 관련글 쓰기

  1. 나그네 2007/05/17 02:37 address edit & del reply

    Lock Table시에 작업할 테이블 모두 lock을 걸어줘야 한다.(select, update, insert, delete에 사용되는 테이블 전부)..-> 틀린것 같은데요
    다른 버전은 모르겠으나.. 5.x 버전 같은 경우..
    To use LOCK TABLES, you must have the LOCK TABLES privilege and the SELECT privilege for the involved tables.
    락 권한과 select 권한만이 필요하단 말은. select 이외의 다른 경우는 작업테이블 모두에 락걸 필요가 없다는 말이 아닐까요? 실제 테스트에서도 select 할 테이블 이외의 작업은 모두 가능했습니다. 서브쿼리의 select 테이블도 관계없습니다. 직접 select할 테이블만 락작업시 락을 걸어야 하죠.

    • BlogIcon deuxign 2007/05/17 10:30 address edit & del

      테스트 결과입니다. 충분한 답변이 될겁니다.

      mysql> select version();
      +-----------+
      | version() |
      +-----------+
      | 5.0.37 |
      +-----------+
      1 row in set (0.00 sec)

      mysql> select * from test2;
      +----+-------+
      | no | value |
      +----+-------+
      | 1 | test1 |
      | 2 | test2 |
      | 3 | test3 |
      +----+-------+
      3 rows in set (0.00 sec)

      mysql> select * from test3;
      Empty set (0.00 sec)

      mysql>
      mysql>
      mysql>
      mysql>
      mysql>
      mysql> lock tables test2 write;
      Query OK, 0 rows affected (0.00 sec)

      mysql> select * from test2;
      +----+-------+
      | no | value |
      +----+-------+
      | 1 | test1 |
      | 2 | test2 |
      | 3 | test3 |
      +----+-------+
      3 rows in set (0.00 sec)

      mysql> select * from test3;
      ERROR 1100 (HY000): 테이블 'test3'는 LOCK TABLES 명령으로 잠기지 않았습니다.
      mysql> insert into test2 values ('4','test4_lock');
      Query OK, 1 row affected (0.00 sec)

      mysql> insert into test3 values ('1','test1_lock');
      ERROR 1100 (HY000): 테이블 'test3'는 LOCK TABLES 명령으로 잠기지 않았습니다.
      mysql> unlock tables;
      Query OK, 0 rows affected (0.00 sec)

      mysql>
      mysql>
      mysql>
      mysql>
      mysql>
      mysql>
      mysql>
      mysql> lock tables test2 write, test3 write;
      Query OK, 0 rows affected (0.00 sec)

      mysql> select * from test2;
      +----+------------+
      | no | value |
      +----+------------+
      | 1 | test1 |
      | 2 | test2 |
      | 3 | test3 |
      | 4 | test4_lock |
      +----+------------+
      4 rows in set (0.00 sec)

      mysql> select * from test3;
      Empty set (0.00 sec)

      mysql> insert into test2 values ('5','test5_lock');
      Query OK, 1 row affected (0.00 sec)

      mysql> insert into test3 values ('1','test1_lock');
      Query OK, 1 row affected (0.00 sec)

      mysql> select * from test3;
      +-----+------------+
      | num | keyword |
      +-----+------------+
      | 1 | test1_lock |
      +-----+------------+
      1 row in set (0.00 sec)

      mysql> insert into test3 values ('2','test2_lock');
      Query OK, 1 row affected (0.00 sec)

      mysql> select * from test3;
      +-----+------------+
      | num | keyword |
      +-----+------------+
      | 1 | test1_lock |
      | 2 | test2_lock |
      +-----+------------+
      2 rows in set (0.00 sec)

      mysql> update test3 set keyword='test1_lock_update' where num='1';
      Query OK, 1 row affected (0.00 sec)
      일치하는 Rows : 1개 변경됨: 1개 경고: 0개

      mysql> select * from test3;
      +-----+-------------------+
      | num | keyword |
      +-----+-------------------+
      | 1 | test1_lock_update |
      | 2 | test2_lock |
      +-----+-------------------+
      2 rows in set (0.00 sec)

      mysql> unlock tables;
      Query OK, 0 rows affected (0.00 sec)

      mysql> select * from test2;
      +----+------------+
      | no | value |
      +----+------------+
      | 1 | test1 |
      | 2 | test2 |
      | 3 | test3 |
      | 4 | test4_lock |
      | 5 | test5_lock |
      +----+------------+
      5 rows in set (0.00 sec)

      mysql> select * from test3;
      +-----+-------------------+
      | num | keyword |
      +-----+-------------------+
      | 1 | test1_lock_update |
      | 2 | test2_lock |
      +-----+-------------------+
      2 rows in set (0.00 sec)

prev 1 ... 142 143 144 145 146 147 148 149 150 ... 233 next