PHP PDO 업무 및 자동 위탁
이제 PDO 쿼리의 시작 전에 갔다 통해 먼저 PDO가 업무를 관리하는 방법을 이해해야합니다 연결되어 있습니다.
트랜잭션 지원 네 가지 속성 (ACID) :
- 원 자성 (자성)
- 일관성 (일관성)
- 절연 (절연)
- 영구 (내구성)
더 간단 오퍼레이션은 트랜잭션에도 단계적 구현을 수행 할뿐만 아니라 보안 데이터베이스에 적용하고, 다른 연결 때때로 간섭 제출하지 않음을 보장하기 위해.
처리 동작은 자동으로 쉽게 스크립트에서 에러를 취급 할 수있는 (아직 제출되지 가정) 요청이 취소 될 수있다.
트랜잭션은 일반적으로 최대 변경 "저축"의 숫자로 수행하고 효과 구현에 오는 것이 허용된다 그렇게 이점이 효율이 크게 변경 될 수 제공하는 것이다.
즉, 트랜잭션 스크립트가 신속하고 잠재적으로 더 강력 할 수있다 (당신은 여전히 그 이익을 거둘 올바르게 사용해야합니다).
불행히도, 모든 데이터베이스는 트랜잭션을 지원하므로 먼저 연결을 열 때, PDO는 소위 "자동 커밋"동작 모드를 필요로합니다.
자동 커밋 모드는 데이터베이스가 아니, 트랜잭션을 지원하지 않는 경우 데이터베이스를 지원하는 경우, 각 쿼리 실행이, 자신의 암시 적 트랜잭션을 갖는다는 것을 의미한다.
당신이 거래를해야하는 경우에는 시작하는 PDO :: 들어 BeginTransaction () 메소드를 사용해야합니다. 기본 드라이버 트랜잭션을 지원하지 않는 경우, 예외가 발생 PDOException (오류없이 처리 설정 어떤 종류의, 이것은 심각한 오류 상태 임).
트랜잭션을 사용할 수 PDO되면 :: 커밋 () 또는 PDO :: 롤백 () 트랜잭션 코드에 따라 완료 성공적으로 실행됩니다.
참고 PDO 여부만을 드라이버 계층 검사에서 트랜잭션 처리 능력. 몇몇 실행 조건이 트랜잭션을 사용할 수없는 것을 의미하고, 데이터베이스 서비스 트랜잭션을 시작하기위한 요청을 수락하면, PDO :: 들어 BeginTransaction ()은 여전히 TRUE없이 에러를 리턴한다. 트랜잭션을 사용하여 MySQL의 데이터베이스 MyISAM 테이블의 좋은 예입니다보십시오.
스크립트가 종료되거나 접속이 완료된 트랜잭션이 없으면 폐쇄하려 할 때, PDO 자동 트랜잭션 롤백 것이다. 명시 적으로 롤백 (rollback)가 데이터 보안을 보장하기 위해 수행되도록 한 다음 가정이, 어딘가 잘못, 트랜잭션을 커밋하지 않을 경우 -이 보안 조치는 스크립트가 예기치 않게 종료의 불일치를 방지하는 데 도움이됩니다.
주 : () 나중에 거래 PDO :: 들어 BeginTransaction을 시작, 자동 일어날 롤백 할 수 있습니다. 수동으로 거래를 시작하는 쿼리를 실행하면 필요한 경우 롤백 할 수 없습니다, 있도록 PDO는 알 수 없습니다.
트랜잭션에서 일괄 처리를 실행 :
다음 예에서, 23 인 ID를 할당, 새 직원에 대한 항목의 집합을 만들 가정합니다. 등록 대상자의 기본 데이터 이외에뿐 아니라 자신의 연봉을 기록 할 필요가있다.
두 업데이트가 매우 간단하지만, PDO :: 들어 BeginTransaction () 및 PDO :: 커밋 () 호출을 닫아 완료, 그 변경하기 전에, 다른 사람들이 이러한 변경 사항을 볼 수 없습니다 확보 할 수있다.
오류가 발생하면, 캐치는 트랜잭션이 개시로부터 압연 이후의 모든 변경을 차단하고 에러 메시지를 출력한다.
<?php try { $dbh = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2', array(PDO::ATTR_PERSISTENT => true)); echo "Connected\n"; } catch (Exception $e) { die("Unable to connect: " . $e->getMessage()); } try { $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $dbh->beginTransaction(); $dbh->exec("insert into staff (id, first, last) values (23, 'Joe', 'Bloggs')"); $dbh->exec("insert into salarychange (id, amount, changedate) values (23, 50000, NOW())"); $dbh->commit(); } catch (Exception $e) { $dbh->rollBack(); echo "Failed: " . $e->getMessage(); } ?>
트랜잭션의 변화에 한정되지 않고, 그 정보를 사용하여 더 많은 변경 및 쿼리를 작성하여 데이터를 추출하기 위해 복잡한 쿼리를 실행할 수 있지만, 트랜잭션이 활성화되었을 때, 사용자가 다른 사람이 진행중인 동작을 변경할 수 있도록 할 수있다.