[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;
'Database' 카테고리의 다른 글
| [Oracle] External Table (0) | 2008/05/06 |
|---|---|
| [MySql] Load Data infile - 파일을 읽어서 테이블에 insert (0) | 2007/07/27 |
| [Mysql] 실행 계획 보기 (2) | 2007/05/29 |
| [Oracle] Oracle 예약어 (0) | 2007/02/27 |
| [MySql] MySql 예약어 (0) | 2007/02/27 |
| [MYSQL] Table에 Lock 사용하기 (2) | 2006/11/13 |
| [Mysql] 테이블 생성 및 전체내용 복사 (2) | 2006/06/15 |
| [Mysql] 테이블 생성쿼리 확인 (0) | 2006/06/15 |
| [Oracle] 시퀀스 생성 추가 삭제 (0) | 2006/03/22 |
| [Mysql] MySQL에서 트랜젝션 사용하기 (0) | 2006/03/22 |
| [Oracle] Rownum (0) | 2006/03/22 |
-
나그네 2007/05/17 02:37
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할 테이블만 락작업시 락을 걸어야 하죠.-
deuxign 2007/05/17 10:30
테스트 결과입니다. 충분한 답변이 될겁니다.
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)
-

이올린에 북마크하기
이올린에 추천하기


