2012-05-14 4 views
6

mysql 커밋 및 트랜잭션에 관한 질문이 있습니다.mysql 커밋 및 트랜잭션

나는 mysql 쿼리를 실행하는 몇 가지 php 문이 있습니다.

방금 ​​다음과 같이 말합니까?

mysql_query("START TRANSACTION"); 
//more queries here 
mysql_query("COMMIT"); 

정확하게 무엇을 할 수 있습니까? 어떻게 도움이됩니까?/선택을

mysql_query("LOCK TABLES t1 WRITE, t2 WRITE"); 
//more queries here 
mysql_query("UNLOCK TABLES t1, t2"); 

겠습니까이 블록 다른 쿼리 어떤 특성을 또는 유일한 기록 : 업데이트를 들면, 삭제 및 삽입은 또한 독서에서 다른 쿼리를 차단이 발견?

또 다른 질문 : 하나의 쿼리가 실행 중이며 다른 쿼리를 차단한다고 가정 해보십시오. 다른 쿼리는 차단 된 데이터에 액세스하려고 시도하고 차단 된 것으로 봅니다. 어떻게 진행 되나요? 데이터가 다시 차단 해제 될 때까지 기다렸다가 쿼리를 다시 실행합니까? 그냥 실패하고 반복해야합니까? 그렇다면 어떻게 확인할 수 있습니까?

고맙습니다. 당신이 "에"입니다 자동 커밋의 기본 설정을 변경하지 않은 경우

데니스

이노에서
+0

InnoDB 또는 MyISAM 테이블을 사용하고 있습니까? – Daan

+0

@Daan InnoDB를 사용합니다. – weltschmerz

답변

12

, 당신은 명시 적으로 시작하거나 하나의 쿼리에 대한 최종 거래 할 필요가 없습니다. 자동 커밋이 켜져 있으면 InnoDB는 모든 단일 SQL 쿼리를 START TRANSACTION; query; COMMIT;에 해당하는 트랜잭션으로 자동으로 묶습니다.

InnoDB에서 자동 커밋을 사용하여 명시 적으로 START TRANSACTION을 사용하면 START TRANSACTION 문 뒤에 실행 된 쿼리가 모두 실행되거나 모두 실패합니다. 예를 들어 은행 계좌에 $ 500를 이체하는 경우 은행 계좌에서 금액을 뺀 후 합산 한 경우에만 해당 작업을 완료해야합니다. 따라서이 경우 다음과 같이 실행하십시오.

START TRANSACTION; 
UPDATE customers SET balance = balance - 500 WHERE customer = 'Daan'; 
UPDATE customers SET balance = balance + 500 WHERE customer = 'Dennis'; 
COMMIT; 

이렇게하면 두 가지 쿼리가 모두 성공적으로 실행되거나 하나만 존재하지는 않습니다. This post에는 거래를 사용해야 할 때에 대해 더 자세히 설명되어 있습니다.

InnoDB에서는 전체 테이블을 잠글 필요가 거의 없습니다. InnoDB는 MyISAM과 달리 로우 레벨 잠금을 지원합니다. 즉, 클라이언트가 전체 테이블을 잠글 필요가 없어 다른 클라이언트를 기다리게 할 수 있습니다. 클라이언트는 실제로 필요한 행만 잠그고 다른 클라이언트가 필요한 행에 계속 액세스 할 수있게해야합니다.

InnoDB 트랜잭션 here에 대한 자세한 내용을 볼 수 있습니다. 교착 상태에 대한 질문은 14.2.8.814.2.8.9 섹션에 나와 있습니다. 쿼리가 실패하면 MySQL 드라이버는 이유를 나타내는 오류 메시지를 반환합니다. 필요한 경우 앱에서 검색어를 다시 발행해야합니다.

마지막으로 예제 코드에서 mysql_query을 사용했습니다. 새 코드를 작성하는 경우 PHP 용 오래된, 느리며 더 이상 사용되지 않는 mysql_ 라이브러리를 사용하지 말고 mysqli_ 또는 PDO를 대신 사용하십시오.

+0

정말 고맙습니다. InnoDB는 자동적으로 행만 잠급니까? 그리고 내 테이블에 자동 커밋이 있는지 여부를 어떻게 확인할 수 있습니까?(phpmyadmin을 사용하고 있습니다) – weltschmerz

+0

'SHOW VARIABLES LIKE 'autocommit'쿼리를 실행하거나 phpMyAdmin 홈 페이지에서'variables'를 클릭 할 수 있습니다. 인덱스 생성은 데이터베이스와 테이블로 이동하여'structure'를 클릭하고 거기에 보이는 폼을 사용하여 인덱스를 만듭니다. 또는 SQL 문을 실행할 수 있습니다. 'ALTER TABLE 테이블 ADD INDEX (필드)'. "InnoBD는 자동으로 행을 잠급니다"라는 뜻인지 확실하지 않습니다. - 그것이 의미하는 바가 있다면 자동으로 전체 테이블을 잠그지 않을 것입니다 :) – Daan

+0

자동 커밋이 설정되었습니다 :) 기본 키는 항상 인덱스 역할을합니까? 내 테이블에 기본 키가 있고 인덱스를 추가하고 싶었지만 기본 키와 동일 할 수 있다고했습니다 ... – weltschmerz