현재 위치: > 최신 기사 목록> PDO :: 트랜잭션의 시작 및 종료 시간을 제어 할 수 있습니까? 올바르게 사용하는 방법?

PDO :: 트랜잭션의 시작 및 종료 시간을 제어 할 수 있습니까? 올바르게 사용하는 방법?

M66 2025-06-30

PHP에서 PDO (PHP Data Objects)는 데이터베이스에 액세스하기위한 가볍고 초록 데이터베이스 액세스 계층입니다. PDO는 트랜잭션 처리를 지원하는 기능을 포함하여 여러 데이터베이스 관리 시스템에 액세스 할 수있는 일관된 API를 제공합니다. 트랜잭션은 모든 성공 또는 모든 실패의 일련의 운영을 참조하여 데이터의 일관성과 무결성을 보장합니다.

PDO :: intransaction () 은 현재 데이터베이스 연결이 트랜잭션에 있는지 확인하는 PDO 클래스의 메소드입니다. 거래에 대한 상태 정보를 제공하지만 거래의 시작 및 종료 시간을 직접 제어하지는 않습니다. 이 기사는 PDO :: intransaction () 의 역할에 대해 자세히 설명하고 트랜잭션 관리에 PDO를 올바르게 사용하는 방법을 소개합니다.

1. pdo :: intransaction () 의 역할

pdo :: intransaction () 메소드는 현재 데이터베이스 연결이 트랜잭션을 진행하고 있는지 여부를 나타내는 부울 값을 반환합니다. 구체적으로, intransaction ()은 트랜잭션이 시작되었지만 커밋되거나 롤백 되지 않은 경우 true를 반환합니다.

사용 예 :

 <span><span><span class="hljs-meta">&lt;?php</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">'root'</span></span><span>, </span><span><span class="hljs-string">''</span></span><span>);

</span><span><span class="hljs-comment">// 거래 중인지 확인하십시오</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">inTransaction</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">else</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-meta">?&gt;</span></span><span>
</span></span>

이 예에서는 현재 트랜잭션이 진행 중이없는 경우 출력은 "현재 트랜잭션이 진행 중이 아닙니다"가됩니다. 거래가 시작되면 출력은 "진행중인 거래"가됩니다.

intransaction ()은 트랜잭션이 활성화되었는지 여부 만 알려주는 것이지만 트랜잭션을 시작하거나 종료하지는 않습니다. 상태 쿼리 방법입니다.

2. 트랜잭션을 시작하고 종료하는 방법

트랜잭션의 시작과 끝은 begintransaction () , commit ()rollback () 메소드에 의해 제어됩니다.

  • begintransaction () : 새 트랜잭션을 시작합니다.

  • Commit () : 현재 거래를 커밋하십시오.

  • 롤백 () : 롤백 현재 트랜잭션.

거래 사용의 예 :

 <span><span><span class="hljs-meta">&lt;?php</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">'root'</span></span><span>, </span><span><span class="hljs-string">''</span></span><span>);

</span><span><span class="hljs-comment">// 거래를 시작하십시오</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">beginTransaction</span></span><span>();

</span><span><span class="hljs-keyword">try</span></span><span> {
    </span><span><span class="hljs-comment">// 데이터베이스 작업을 수행합니다</span></span><span>
    </span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">exec</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO users (name, email) VALUES ('John Doe', 'john@example.com')"</span></span><span>);
    
    </span><span><span class="hljs-comment">// 모든 것이 잘되면,거래를 제출하십시오</span></span><span>
    </span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</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>-&gt;</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>-&gt;</span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

이 예에서는 begintransaction () 이 트랜잭션을 시작합니다. 실행 중에 오류가 발생하지 않으면 트랜잭션은 Commit ()를 통해 제출되며 모든 데이터베이스 작업이 최종적으로 저장됩니다. 트랜잭션에서 예외가 발생하면 롤백 ()을 통해 트랜잭션을 롤백하여 데이터베이스가 일관성을 유지하는지 확인하십시오.

3. pdo :: intransaction ()을 올바르게 사용하는 방법

PDO :: intransaction ()은 거래 상태를 감지하는 데 도움이 될 수 있지만 일반적으로 거래 상태의 디버깅 또는 조건부 판단에 사용됩니다. 예를 들어, 거래가 시작되었는지 확인하여 거래를 시작하지 않고 커밋 또는 롤백 운영을 피하십시오.

예 : 여러 제출물 또는 롤백을 피하십시오

 <span><span><span class="hljs-meta">&lt;?php</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">'root'</span></span><span>, </span><span><span class="hljs-string">''</span></span><span>);

</span><span><span class="hljs-comment">// 거래를 시작하십시오</span></span><span>
</span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">beginTransaction</span></span><span>();

</span><span><span class="hljs-keyword">try</span></span><span> {
    </span><span><span class="hljs-comment">// 데이터베이스 작업을 수행합니다</span></span><span>
    </span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">exec</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO users (name, email) VALUES ('Jane Doe', 'jane@example.com')"</span></span><span>);

    </span><span><span class="hljs-comment">// 거래가 시작되었는지 확인하십시오,반복적 인 제출을 피하십시오</span></span><span>
    </span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">inTransaction</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">else</span></span><span> {
        </span><span><span class="hljs-comment">// 거래를 제출하십시오</span></span><span>
        </span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</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-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">inTransaction</span></span><span>()) {
        </span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</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>-&gt;</span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>();
}
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

이 예에서는 intransaction () 이 트랜잭션이 시작되었는지 확인하고 거래가 커밋 된 경우 다시 커밋되지 않도록하는 데 사용됩니다.

4. PDO의 한계 :: intransaction ()

  • PDO :: intransaction ()은 트랜잭션이 진행 중이며 거래의 시작과 끝을 제어하지 않는지에 대한 정보 만 제공합니다. 거래를 시작하거나 커밋 할 수는 없으며 거래 상태 만 알려줄 수 있습니다.

  • 트랜잭션은 개발자가 제어하는 ​​프로세스이므로 intransaction ()는 트랜잭션을 제대로 관리 할 수 ​​있도록 보조 도구로만 사용됩니다. 트랜잭션 제어 방법 (예 : begintransaction () , commit ()rollback () )을 대체 할 수 없습니다.

5. 결론

PDO :: intransaction ()은 거래 관리에서 도우미 역할을합니다. 트랜잭션의 현재 상태를 확인하는 데 사용될 수 있지만 거래의 시작 또는 끝을 직접 제어하지는 않습니다. 실제 개발에서는 Transaction의 수명주기를 관리하기 위해 BeginTransaction () , Commit ()Rollback () 에 의존해야합니다. PDO :: intransaction ()은 거래 운영의 정확성을 보장하고 거래없이 운영을 잘못 커밋하거나 롤백하지 않도록 도와줍니다.

PDO가 제공 한 트랜잭션 방법 및 상태 검사를 올바르게 사용하면 데이터베이스 작업의 보안, 데이터 일관성 및 잠재적 오류를 피할 수 있습니다.

  • 관련 태그:

    PDO