잠금
데이터베이스 시스템이 파일 시스템보다 효율적이고 향상된 점은 다수의 사용자가 동시 에 접속하여 데이터를 처리할 수 있다는 것입니다. 하지만 아무리 좋은 데이터베이스 관 리 시스템 이어도 순간적으로 여러 사람들이 동일한 데이터를 접근할 때는 문제가 발생할 수 있습니다.
접근의 우선순위에 따라서 데이터가 순간적으로 변경되거나, 데이터의 값에 오류가 발생 할 수 있습니다. 특히 데이터를 변경할 때 동시 접속에 의한 문제가 발생할 수 있습니다.
잠금
테이블의 데이터를 조작할 때 권한을 통하여 일부 동작들을 제한할 수 있습니다. 테이블 을 잠금을 설정합니다.
| 쿼리 문법 |
LOCK TABLES 테이블명 옵션
옵션 종류
- READ: SELECT 명령만 가능합니다. 다른 작업들의 명령은 할 수 없습니다.
- READ_LOCAL: 로컬만 읽기 가능합니다.
- WRITE: LOCK을 실행한 이외의 사용자는 제한합니다.
| 콘솔 실습 화면 |
mysql> lock tables members read;
Query OK, 0 rows affected (0.00 sec)
| PHP 예제 | mysql.class.php 파일에 메서드 예제를 추가합니다.
// 테이블 잠금
// 매개인자: 데이블명, 옵션 = 옵션이 없을 경우 read로 설정합니다.
// 반한값 : 객체 this를 반환 합니다.
public function tableLock($tableName, $option="read")
{
$queryString = "LOCK TABLES ";
if ($tableName) {
$queryString .= $tableName;
// 옵션이 없는 경우에는 READ로 기본설정 합니다.
$queryString .= " ".$option;
// 쿼리를 전송합니다.
if (mysqli_query($this->dbcon, $queryString)=== TRUE) {
$this->msgEcho("쿼리성공] ".$queryString);
$this->msgEcho($tableName." LOCK!");
} else {
$this->msgEcho("Error] ".$queryString);
}
// 객체 반환, 매서드체인
return $this;
}
}
해제
향후 정상적인 데이터 처리를 위해서 반드시 잠금된 테이블은 사용 후에 해제해야 합 니다. 잠금 해제 쿼리는 잠금 설정과 달리 별도의 테이블을 선택하지 않습니다. 해제 쿼 리는 잠금 설정된 모든 테이블을 동시에 해제하게 됩니다.
| 쿼리 문법 |
UNLOCK TABLES
| 콘솔 실습 화면 |
mysql> unlock tables;
Query OK, 0 rows affected (0.00 sec)
| PHP 예제 | mysql.class.php 파일에 메서드 예제를 추가합니다.
// 테이블 잠금해제
public function tableUnLock()
{
$queryString = "UNLOCK TABLES ";
// 쿼리를 전송합니다.
if (mysqli_query($this->dbcon, $queryString)=== TRUE) {
$this->msgEcho("쿼리성공] ".$queryString);
$this->msgEcho(" TABLE UNLOCK!");
} else {
$this->msgEcho("Error] ".$queryString);
}
// 객체 반환, 매서드체인
return $this;
}
테이블 잠금 및 해제 관련 클래스를 추가하고 이를 이용한 예제를 만들어 실험해 보도록 하겠습니다.
예제 파일 | sql-05.php
<?php
include "dbinfo.php";
include "mysql.class.php";
// ++ Mysqli DB 연결.
$db = new JinyMysql();
// 테이블을 잠금설정 합니다.
$db->tableLock("members");
// 잠금된 테이블을 해제 합니다.
$db->tableUnLock();
?>
화면 출력
mysql connected!
members LOCK!
TABLE UNLOCK!
항상 데이터를 삽입하거나 변경할 때 테이블을 잠금 설정하는 것은 안전한 데이터 조작을 위해 유용합니다. 또한 모든 조작 처리 후에는 반드시 테이블을 다시 해제하도록 합니다.