現在の位置: ホーム> 最新記事一覧> mysqli :: begin_transactionのトランザクションの分離レベルを設定および調整する方法は?

mysqli :: begin_transactionのトランザクションの分離レベルを設定および調整する方法は?

gitbox 2025-06-17

PHPでは、MySQLのデータベースを使用する際にデータベースと対話するために、 MySQLI拡張機能が最も一般的に使用されるツールの1つです。データベース操作が必要なトランザクションが必要な場合、 MySQLI :: begin_Transactionメソッドは、トランザクションの開始を制御するメカニズムを提供します。ただし、単にトランザクションを開くことに加えて、トランザクションの分離レベルは、データの読み取りとロック動作に直接影響するため、非常に重要な考慮事項でもあります。

この記事では、 mysqli :: begin_transactionのトランザクションの分離レベルを設定および調整する方法を紹介し、異なる分離レベルの役割と適用可能なシナリオを説明します。

トランザクションの分離レベルは何ですか?

トランザクション分離レベルは、他のトランザクションへのトランザクションにおける操作の可視性を定義します。異なる分離レベルは、トランザクションが実行されたときにデータが他の同時トランザクションとどのように相互作用するかを決定します。主に4つのトランザクション分離レベルがあります。

  1. committedの読み取り:最低の分離レベルでは、トランザクションが他のコミットされていないトランザクションからデータを読み取ることができます。これにより、汚れた読み取り、繰り返しのない読み取り、およびPhantom読み取りが生じる可能性があります。

  2. commited(読み取りコミット) :トランザクションはコミットされたデータのみを読むことができます。汚い読みは避けられますが、あなたはまだ繰り返しのない読書と幻の読みに遭遇するかもしれません。

  3. 繰り返し読み取り:トランザクションの実行中、すべての読み取りデータデータがロックされ、他のトランザクションはこれらの行を変更できません。汚い読み物と繰り返しのない読書は避けられますが、幻想の読みはまだ起こる可能性があります。

  4. Serializable(Serializable) :最高の分離レベル、すべてのトランザクションは完全に分離され、汚い読み、非繰り返し読み取り、幻の読み取り値はありません。パフォーマンスは低いですが、データの一貫性と整合性を保証します。

mysqli :: begin_transactionでトランザクションの分離レベルを設定するにはどうすればよいですか?

MySQLIでは、 MySQLI :: Set_charsetメソッドを介してトランザクションの分離レベルを設定できます。通常、これは、 begin_transactionを呼び出す前に、設定されたトランザクション分離レベルSQLステートメントを使用して設定する必要があります。

トランザクション分離レベルを設定および調整する手順は次のとおりです。

1.データベース接続を作成します

まず、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>-&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>

2.トランザクションの分離レベルを設定します

begin_transactionを呼び出す前に、SQLステートメントを使用して、トランザクションの分離レベルを指定できます。たとえば、再現可能な読み取り分離レベルを設定するには:

 <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">"SET TRANSACTION ISOLATION LEVEL REPEATABLE READ"</span></span><span>);
</span></span>

必要に応じて、適切な分離レベルを選択できます。

3.トランザクションを開始します

トランザクションの分離レベルを設定した後、 begin_transactionを使用してトランザクションを開始します。

 <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>

4.トランザクション操作を実行します

トランザクションで一連のデータベース操作を実行します。

 <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>-&gt;</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>-&gt;</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>-&gt;</span><span><span class="hljs-title function_ invoke__">rollback</span></span><span>();
}
</span></span>

5。トランザクションを終了します

トランザクションの実行に応じて、トランザクションをコミットまたはロールバックすることを選択できます。

  • $ mysqli-> commit()を使用して、トランザクションをコミットします。

  • $ mysqli-> rollback()を使用して、トランザクションをロールバックします。

例:完全なコード

<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-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__">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>-&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">// いくつかのデータベース操作を実行します</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 products (name, price) VALUES ('product1', 100)"</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 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>-&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>

分離レベルの選択

適切な分離レベルを選択することは、多くの場合、ビジネス要件とシステムの並行性に依存します。一般的なシナリオに関するいくつかの提案を次に示します。

  • 高い並行性クエリ操作:選択して読み取りまたは繰り返し可能な読み取りを選択して、パフォーマンスとデータの一貫性のバランスを取ります。

  • データの一貫性を厳密に保証する必要がありますシリアル化可能な選択を選択します。これにより、トランザクションが完全に分離されていることが保証されますが、パフォーマンスが大きく影響します。

  • 高性能要件を備えたアプリケーション:高性能要件の場合、読み取りを選択していませんが、読書の問題には注意してください。

要約します

PHPでMySQLI拡張機能を使用する場合、トランザクションの分離レベルを設定することは非常に重要な操作です。設定されたトランザクション分離レベルステートメントを使用することにより、 MySqli :: begin_Transactionの前に分離レベルを調整して、トランザクション実行の信頼性と一貫性を確保することができます。適切な分離レベルを選択することは、データベースのパフォーマンスとデータの一貫性に重要な影響を与えるため、開発プロセス中に、ビジネスニーズに応じて適切なトランザクション分離レベルを慎重に選択する必要があります。