2013-08-19 4 views
1

PDO의 테이블에서 작업을 수행하기 전에 테이블을 잠그려고하므로 두 사용자가 같은 시간에 같은 작업을 수행 할 수 없습니다.잠금 테이블 sql + php PDO

$this -> link ->beginTransaction(); 
$this -> link ->exec('LOCK TABLES `MYTABLE` WRITE;'); 
//do something... 
$this -> link ->exec('UNLOCK TABLES'); 
$this -> link ->commit(); 

하지만 두 사용자가이 쿼리를하려고하면, 그들은 모두 스택 :

나는 다음과 같이했습니다. 내가 뭘 잘못 했니?

감사합니다.

+2

트랜잭션 중에 테이블을 잠글 필요가 있습니까? –

+0

왜 테이블을 잠그시겠습니까? – overflow

+0

두 사용자가 동시에이 작업을 수행하지 않도록하려면 예를 들어 동일한 사용자 이름으로 등록하십시오. 그것이 테이블의 열쇠이지만, 엉망입니다. – user2696540

답변

0
<?php 
$this->link->beginTransaction(); 
$this->link->query('select yourcolumn from yourtable where yourcondition for update'); 
sleep(20); 
$this->link->commit(); 

열기 MySQL의 워크 벤치 및 인 다음

begin; 
select count(yourcolumn) from yourtable where yourcondition for update; 
// will lock here 

그냥 항상 열려있는 트랜잭션을 기억 실행하고 난 다음을 테스트 한

열 데이터를 선택하면 업데이트 사용을 선택하십시오 또한 위의 PHP 스크립트가 실행되는 동안 (당신이 위의 PHP 스크립트가 실행되는 동안) 작업대에서 다음을 실행하면 잠김에 의해 보호됩니다.

update yourtable set yourcolumn=yourvalue where yourcondition; 
// will lock here because php has obtained lock, no need to use transaction here 
(210)

그러나 다음은 당신이 들어 BeginTransaction이고 (위의 PHP scriptis 실행하면서) 또한

select yourcolumn from yourtable where yourcondition; 
// will immediately return resulset because you are not using transaction AND "for update" 

, 당신은 당신의 코드를 살펴 가질 수있는 워크 벤치에서 다음을 실행하면, 잠금에 의해 보호되지 않습니다 장기 실행 트랜잭션은 테이블 잠금을 오래 사용하기 때문에 사용됩니다. 예를 들어 파일 가져 오기 작업의 트랜잭션 만 있습니다. 테이블에 첫 번째 레코드를 삽입하면 테이블이 잠길 것입니다.

begin; 
insert into yourtable values yourvalues; 
// will acquire lock here, other mysql workbench will be deadlock 
// until your whole import operation is done and rollback/commit your upload