PHP에서 MySQLI Extension은 MySQL 데이터베이스를 사용할 때 데이터베이스와 상호 작용하는 데 가장 일반적으로 사용되는 도구 중 하나입니다. 데이터베이스 작업이 필요한 트랜잭션이 필요한 경우 MySQLI :: begin_transaction 메소드는 트랜잭션 시작을 제어하는 메커니즘을 제공합니다. 그러나 단순히 트랜잭션을 개설하는 것 외에도 트랜잭션의 격리 수준은 데이터의 읽기 및 잠금 동작에 직접적인 영향을 미치기 때문에 매우 중요한 고려 사항입니다.
이 기사는 mysqli :: begin_transaction 에서 트랜잭션의 격리 수준을 설정하고 조정하는 방법을 살펴보고 다른 격리 수준의 역할 및 적용 가능한 시나리오를 설명합니다.
거래 격리 수준은 다른 거래로의 거래에서 운영의 가시성을 정의합니다. 다른 격리 수준에 따라 거래가 실행될 때 데이터가 다른 동시 트랜잭션과 상호 작용하는 방법을 결정합니다. 주로 4 개의 트랜잭션 격리 수준이 있습니다.
커밋되지 않은 읽기 : 가장 낮은 격리 수준을 사용하면 트랜잭션이 다른 커밋되지 않은 트랜잭션의 데이터를 읽을 수 있습니다. 이로 인해 더러운 읽기, 반복 할 수없는 읽기 및 팬텀이 읽을 수 있습니다.
커밋 된 읽기 (Committed) : 트랜잭션은 커밋 된 데이터 만 읽을 수 있습니다. 더러운 독서는 피하기를 피하지만 여전히 반복 할 수없는 독서 및 팬텀 독서를 만날 수 있습니다.
반복 가능한 읽기 : 트랜잭션 실행 중에 모든 읽기 행 데이터가 잠그고 다른 트랜잭션은 이러한 행을 수정할 수 없습니다. 더러운 독서와 반복 할 수없는 독서는 피하지만 팬텀 독서는 여전히 발생할 수 있습니다.
직렬화 가능 (직렬화 가능) : 최고 분리 수준, 모든 트랜잭션은 완전히 격리되며 더러운 읽기, 반복 불가능한 독서 및 팬텀 독서는 없습니다. 성능이 낮지 만 데이터의 일관성과 무결성을 보장합니다.
MySQLI 에서는 mysqli :: set_charset 메소드를 통해 트랜잭션의 격리 수준을 설정할 수 있습니다. 일반적으로 이것은 시작 트랜잭션 격리 레벨 SQL 문을 사용하여 시작해야합니다.
트랜잭션 격리 수준을 설정하고 조정하는 단계는 다음과 같습니다.
먼저 MySQL 데이터베이스에 대한 연결을 만듭니다.
<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-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>->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>->connect_error);
}
</span></span>
stark_transaction을 호출하기 전에 SQL 문을 사용하여 트랜잭션의 격리 수준을 지정할 수 있습니다. 예를 들어, 반복 가능한 읽기 격리 수준을 설정하려면 다음과 같습니다.
<span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"SET TRANSACTION ISOLATION LEVEL REPEATABLE READ"</span></span><span>);
</span></span>
필요에 따라 적절한 격리 수준을 선택할 수 있습니다.
트랜잭션의 격리 수준을 설정 한 후 begin_transaction을 사용하여 트랜잭션을 시작하십시오.
<span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">begin_transaction</span></span><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">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO table_name (column1, column2) VALUES ('value1', 'value2')"</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-title function_ invoke__">commit</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>-></span><span><span class="hljs-title function_ invoke__">rollback</span></span><span>();
}
</span></span>
거래 실행에 따라 거래를 커밋하거나 롤백 할 수 있습니다.
$ mysqli-> commit ()를 사용하여 거래를 커밋하십시오.
$ mysqli-> rollback ()을 사용하여 트랜잭션을 롤백하십시오.
<span><span><span class="hljs-meta"><?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-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$mysqli</span></span><span>->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>->connect_error);
}
</span><span><span class="hljs-comment">// 트랜잭션 격리 수준을 설정하십시오</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"SET TRANSACTION ISOLATION LEVEL SERIALIZABLE"</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-title function_ invoke__">begin_transaction</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">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO products (name, price) VALUES ('product1', 100)"</span></span><span>);
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">query</span></span><span>(</span><span><span class="hljs-string">"UPDATE products SET price = 150 WHERE name = 'product2'"</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-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>-></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-comment">// 데이터베이스 연결을 닫습니다</span></span><span>
</span><span><span class="hljs-variable">$mysqli</span></span><span>-></span><span><span class="hljs-title function_ invoke__">close</span></span><span>();
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
적절한 격리 수준을 선택하는 것은 종종 비즈니스 요구 사항과 시스템 동시성에 따라 다릅니다. 일반적인 시나리오에 대한 몇 가지 제안은 다음과 같습니다.
높은 동시성 쿼리 작동 : 성능 및 데이터 일관성의 균형을 맞추기 위해 커밋 또는 반복 가능한 읽기를 선택하십시오.
데이터 일관성이 엄격하게 보장되어야합니다 . 트랜잭션이 완전히 격리되도록하는 직렬화 가능한 선택을 선택하지만 성능은 크게 영향을받습니다.
고성능 요구 사항이있는 응용 프로그램 : 고성능 요구 사항의 경우, 쿠치되지 않은 읽기를 선택할 수 있지만 읽기 문제에주의하십시오.
PHP에서 MySQLI 확장을 사용할 때 트랜잭션의 격리 수준을 설정하는 것이 매우 중요한 작업입니다. SET TRANSACTION DERENTAING 레벨 문을 사용하여 MySQLI :: begin_transaction 이전의 격리 수준을 조정하여 트랜잭션 실행의 신뢰성과 일관성을 보장 할 수 있습니다. 적절한 격리 수준을 선택하면 데이터베이스 성능 및 데이터 일관성에 중요한 영향을 미치므로 개발 프로세스 중에는 비즈니스 요구에 따라 적절한 트랜잭션 격리 수준을 신중하게 선택해야합니다.
관련 태그:
mysqli