데이터베이스 운영에서 트랜잭션 관리는 매우 중요한 개념으로, 데이터 운영의 원자력, 일관성, 격리 및 지속성 (즉, 산성 특성)을 보장합니다. PHP에서는 PDO (PHP Data Objects)를 사용하여 데이터베이스와 상호 작용할 수 있으며, PDO가 제공 한 BeginTransaction () , Commit () 및 Rollback () 메소드를 통해 트랜잭션 관리를 구현할 수 있습니다. 이 기사는 PDO의 시작 추출을 롤백 과 결합하여 트랜잭션 롤백 작동을 구현하는 방법을 자세히 소개합니다.
트랜잭션은 성공하거나 실패하는 일련의 운영 집합을 의미합니다. 트랜잭션은 데이터베이스 작업의 일관성과 무결성을 보장합니다. 데이터베이스 시스템에서 트랜잭션의 기본 특성은 산으로 설명 할 수 있습니다.
원자력 : 트랜잭션의 모든 운영이 완료되거나 완료되지 않습니다.
일관성 : 트랜잭션 실행으로 인해 데이터베이스가 일관된 상태에서 다른 상태로 전환됩니다.
격리 : 여러 트랜잭션이 동시에 실행되면 한 트랜잭션의 실행은 다른 거래에 의해 방해해서는 안됩니다.
내구성 : 트랜잭션이 커지면 데이터베이스 변경이 영구적으로 저장됩니다.
PDO에서는 거래의 기본 운영에는 다음이 포함됩니다.
begintransaction () : 트랜잭션을 시작합니다.
Commit () : 커밋 거래.
롤백 () : 롤백 트랜잭션.
일반적으로 데이터베이스 작업 중에 단계 오류가 발생하면 Rollback () 메소드를 사용하여 트랜잭션을 롤백하고 모든 이전 작업을 취소 할 수 있습니다.
레코드 삽입, 레코드 업데이트 등과 같은 여러 데이터베이스 작업을 수행해야한다고 가정합니다. 작업 중 하나가 실패하면 모든 이전 작업을 취소하여 데이터베이스 일관성을 보장 할 수 있습니다. 현재 시작 transaction () 및 rollback () 메소드를 사용할 수 있습니다.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-comment">// 만들다PDO연결하다</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">PDO</span></span><span>(</span><span><span class="hljs-string">'mysql:host=localhost;dbname=testdb'</span></span><span>, </span><span><span class="hljs-string">'username'</span></span><span>, </span><span><span class="hljs-string">'password'</span></span><span>);
</span><span><span class="hljs-comment">// 오류 모드를 예외로 설정하십시오</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">setAttribute</span></span><span>(PDO::</span><span><span class="hljs-variable constant_">ATTR_ERRMODE</span></span><span>, PDO::</span><span><span class="hljs-variable constant_">ERRMODE_EXCEPTION</span></span><span>);
</span><span><span class="hljs-comment">// 거래를 시작하십시오</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">beginTransaction</span></span><span>();
</span><span><span class="hljs-comment">// 첫 번째를 실행하십시오SQL작동하다</span></span><span>
</span><span><span class="hljs-variable">$sql1</span></span><span> = </span><span><span class="hljs-string">"INSERT INTO users (username, email) VALUES ('john_doe', '[email protected]')"</span></span><span>;
</span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">exec</span></span><span>(</span><span><span class="hljs-variable">$sql1</span></span><span>);
</span><span><span class="hljs-comment">// 두 번째를 실행하십시오SQL작동하다</span></span><span>
</span><span><span class="hljs-variable">$sql2</span></span><span> = </span><span><span class="hljs-string">"UPDATE accounts SET balance = balance - 100 WHERE username = 'john_doe'"</span></span><span>;
</span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">exec</span></span><span>(</span><span><span class="hljs-variable">$sql2</span></span><span>);
</span><span><span class="hljs-comment">// 모든 것이 괜찮다면,거래를 제출하십시오</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">commit</span></span><span>();
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"거래 제출 성공!"</span></span><span>;
} </span><span><span class="hljs-keyword">catch</span></span><span> (</span><span><span class="hljs-built_in">Exception</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-comment">// 오류가 발생하는 경우,트랜잭션을 롤백하십시오</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span>-></span><span><span class="hljs-title function_ invoke__">rollBack</span></span><span>();
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"거래 롤백:"</span></span><span>, </span><span><span class="hljs-variable">$e</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
PDO 연결 설정 : 먼저 PDO를 통해 MySQL 데이터베이스에 연결하고 오류 모드를 pdo :: errmode_exception 으로 설정하여 오류가 발생하면 예외가 발생합니다.
트랜잭션 시작 : $ pdo-> beginTransaction ()을 호출하여 PDO에게 트랜잭션을 시작하도록 지시합니다. 현재 모든 데이터베이스 작업은 거래 관리하에 있습니다. 작업이 실패하면 다른 작업이 제출되지 않습니다.
SQL 작업 수행 :
첫 번째 SQL 작업은 사용자 레코드를 삽입하는 것입니다.
두 번째 SQL 작업은 사용자 계정의 잔액을 업데이트하는 것입니다.
커밋 트랜잭션 : 모든 운영이 성공하면 모든 작업을 데이터베이스에 영구적으로 저장하기 위해 $ pdo-> commit () 로 전화하여 트랜잭션을 제출합니다.
롤백 트랜잭션 : 실행 중에 예외가 발생하면 (예 : 두 번째 SQL 조작이 실패) 캐치 블록의 코드가 트리거되고 $ pdo-> rollback () 가 트랜잭션 롤백을 요구하고 커밋되지 않은 모든 작업이 취소됩니다.
트랜잭션의 원자성 : beginTransaction ()을 사용한 후 모든 데이터베이스 작업은 전체적으로 처리됩니다. 오류가 발생하면 Rollback ()가 전체 트랜잭션을 취소하여 데이터 일관성을 보장 할 수 있습니다.
예외 처리 : 시도가 실패 할 때 트랜잭션을 제 시간에 롤백 할 수 있도록 트리 캐치 블록을 사용하여 예외를 포착해야합니다.
다중 거래 운영 : 트랜잭션에서 여러 운영을 수행 할 때 트랜잭션이 커밋되기 전에 오류가 발생하지 않는 한 모든 운영이 적용됩니다.
PDO의 beginTransaction () 및 Rollback () 메소드를 통해 PHP의 트랜잭션을 효율적으로 관리하고 오류가 발생하면 데이터베이스 작업의 원자력과 일관성을 보장 할 때 트랜잭션 롤백 작업을 수행 할 수 있습니다. 이 방법은 특히 펀드 거래 및 주문 처리와 같은 민감한 작업을 처리 할 때 여러 데이터베이스 작업이 필요한 시나리오에서 매우 유용합니다. 트랜잭션 롤백은 데이터 불일치를 피할 수 있습니다.
관련 태그:
PDO