현재 위치: > 최신 기사 목록> mysqli :: begin_transaction 함수의 기본 사용량은 무엇입니까? 거래 시작 방법에 대해 자세히 설명합니다

mysqli :: begin_transaction 함수의 기본 사용량은 무엇입니까? 거래 시작 방법에 대해 자세히 설명합니다

gitbox 2025-08-17

1. 거래 란 무엇입니까?

거래의 기본 개념은 "모든 성공 또는 모든 실패"입니다. 트랜잭션의 작업이 실패하면 거래의 모든 운영이 롤백 (취소)됩니다. 거래에는 일반적으로 다음 네 가지 특성 (산 원리)이 포함됩니다.

  • 원자력 : 트랜잭션의 모든 운영이 완료되거나 완료되지 않았습니다.

  • 일관성 : 트랜잭션은 데이터베이스를 일관된 상태에서 다른 상태로 전환해야합니다.

  • 격리 : 거래 실행은 다른 거래에 의해 방해해서는 안됩니다.

  • 내구성 : 일단 거래가 커지면 데이터는 영구적이어야하며 손실되지 않습니다.

MySQL 데이터베이스에서는 트랜잭션이 주로 InnoDB 저장 엔진에 의존하지만 InnoDB는 트랜잭션을 지원하고 MyISAM 과 같은 다른 스토리지 엔진은 그렇지 않습니다.


2. mysqli :: begin_transaction function의 기본 사용

PHP에서는 mysqli :: begin_transaction 함수가 명시 적으로 트랜잭션을 시작하는 데 사용됩니다. 이 기능을 호출 한 후 MySQL은 개발자가 Commit () 또는 Rollback ()을 명시 적으로 호출 할 때까지 즉시 데이터를 제출하거나 롤백하지 않고 트랜잭션을 시작합니다.

기능 서명 :
 <span><span>mysqli::</span><span><span class="hljs-title function_ invoke__">begin_transaction</span></span><span>();
</span></span>

함수에는 매개 변수가없고 리턴 값이 무효 입니다. 즉, 결과는 반환되지 않습니다. 주로 트랜잭션을 시작하는 데 사용되며 일련의 데이터베이스 작업을 수행 할 수 있습니다.

사용 프로세스 :
  1. 데이터베이스에 연결 : 먼저 MySQLI_Connect 또는 객체 지향 메소드를 통해 데이터베이스 연결을 설정해야합니다.

  2. 트랜잭션을 시작하십시오 : TarkEtransaction을 호출하여 트랜잭션을 시작하십시오.

  3. SQL 작업 수행 : 데이터 삽입, 업데이트 또는 삭제와 같은 트랜잭션에서 일련의 SQL 작업을 수행합니다.

  4. 커밋 또는 롤백 : 실행 결과에 따라 커밋 또는 롤백 여부를 결정합니다.

샘플 코드 :
 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 연결을 만듭니다</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span> = </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-title function_ invoke__">mysqli</span></span><span>(</span><span><span class="hljs-string">"localhost"</span></span><span>, </span><span><span class="hljs-string">"user"</span></span><span>, </span><span><span class="hljs-string">"password"</span></span><span>, </span><span><span class="hljs-string">"database"</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">$mysqli</span></span><span>-&gt;connect_error) {
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"연결이 실패했습니다: "</span></span><span> . </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;connect_error);
}

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

</span><span><span class="hljs-keyword">try</span></span><span> {
    </span><span><span class="hljs-comment">// 구현하다 SQL 작동하다</span></span><span>
    </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO users (name, email) VALUES ('Alice', '[email protected]')"</span></span><span>);
    </span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"UPDATE users SET email = '[email protected]' WHERE name = 'Bob'"</span></span><span>);
    
    </span><span><span class="hljs-comment">// 오류가없는 경우,거래를 제출하십시오</span></span><span>
    </span><span><span class="hljs-variable">$mysqli</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">$mysqli</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-comment">// 연결을 닫으십시오</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-meta">?&gt;</span></span><span>
</span></span>

3. 트랜잭션의 오류 처리

트랜잭션을 사용할 때 오류 처리가 중요합니다. 우리는 일반적으로 Try-Catch 문을 통해 예외를 포착하고 오류가 발생하면 거래를 롤백합니다. 이를 통해 작업이 중간에 실패하더라도 모든 이전 작업이 취소되고 데이터베이스 일관성이 유지됩니다.

위의 코드에서는 SQL 작업 (예 : 데이터베이스 제한 조건 충돌)을 수행 할 때 오류가 발생한다고 가정하면 캐치 블록은이 오류를 포착하고 $ mysqli-> rollback () 을 통해 모든 데이터베이스 작업을 롤백합니다.


4. 거래 커밋 및 롤백

  • 커밋 트랜잭션 : 트랜잭션의 모든 운영이 성공적으로 실행되면 Commit () 메소드를 호출하여 트랜잭션을 제출할 수 있습니다. 즉, 모든 수정 사항이 데이터베이스에 영구적으로 저장됩니다.

  • 롤백 : 트랜잭션에서 오류가 발생하면 Rollback () 메소드를 호출하여 이전에 수행 된 모든 SQL 작업을 취소하고 트랜잭션이 시작되기 전에 데이터베이스를 상태로 복원하십시오.

커밋 및 롤백은 거래 제어의 열쇠이며 거래의 최종 결과를 결정합니다.

예:
 <span><span><span class="hljs-comment">// 거래를 제출하십시오</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">commit</span></span><span>();

</span><span><span class="hljs-comment">// 트랜잭션을 롤백하십시오</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">rollback</span></span><span>();
</span></span>

5. 주목할만한 것들

  • 자동 제출 모드 : MySQL은 기본적으로 자동 제출 모드를 활성화합니다. 즉, 각 SQL 문은 실행 직후에 제출됩니다. 트랜잭션을 사용하려면 자동 커밋 모드를 수동으로 비활성화해야합니다. MySQLi-> AutoCommit (False) 을 통해 자동 제출을 비활성화 할 수 있습니다.

    예:

     <span><span><span class="hljs-variable">$mysqli</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">autocommit</span></span><span>(</span><span><span class="hljs-literal">FALSE</span></span><span>);  </span><span><span class="hljs-comment">// 자동 제출을 비활성화합니다</span></span><span>
    </span></span>
  • 거래 중첩 : MySQL은 실제 중첩 거래를 지원하지 않습니다. 한 번의 거래에서 다른 거래를 시작하면 내부 트랜잭션의 커밋 또는 롤백은 외부 거래에 영향을 미치지 않습니다.