mysqli :: release_savepointに飛び込む前に、トランザクションとロールバックメカニズムを理解する必要があります。トランザクションとは、すべてが正常に実行されるか、すべてが失敗し、ロールバック(つまり、実行されたすべての操作を元に戻す)を実行する一連のデータベース操作のコレクションを指します。通常、トランザクションには、酸の特性と呼ばれる次の4つの特性が含まれます。
Atomity :トランザクションのすべての操作は、完全に実行されるか、まったく実行されません。
一貫性:データベースは、トランザクションが実行される前後に一貫した状態でなければなりません。
分離:取引の実行は、他のトランザクションによって妨害されるべきではありません。
耐久性:トランザクションが完了した後、データベースの変更は永続的です。
トランザクションの実行中にエラーが発生すると、開発者はロールバックメカニズムを使用して、トランザクションが開始される前にデータベースを状態に復元できます。ロールバックは、ロールバックSQLステートメントを介して実装できます。
セーブポイントは、トランザクションのマーカーポイントであり、開発者がトランザクションで複数のチェックポイントを設定できるようにします。トランザクションに問題がある場合、開発者はトランザクション全体を完全にロールバックするのではなく、セーブポイントにロールバックできます。これにより、エラーによって引き起こされる操作ロールバック範囲を削減し、効率を向上させることができます。
たとえば、トランザクションに一連の操作が必要であり、いくつかのステップで、開発者はSavepointを使用して、実行されたすべての操作を失う代わりに、いくつかの操作を元に戻すことができます。
mysqli :: release_savepoint関数は、トランザクションで作成されたセーブポイントをリリース(削除)するために使用されます。開発者がセーブポイントが不要になったことを確認すると、機能を解放するために呼び出され、それによりデータベースで使用されなくなったリソースをクリーンアップできます。これの利点は、トランザクションのセーブポイントの数を減らし、効率的なトランザクション管理を保証するのに役立つことです。
<span><span>mysqli::</span><span><span class="hljs-title function_ invoke__">release_savepoint</span></span><span>(</span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$savepoint</span></span><span>): </span><span><span class="hljs-keyword">bool</span></span><span>
</span></span>
$ savepoint :リリースされるセーブポイントの名前。
成功: trueを返します。
失敗: falseおよびエラー情報を返し、mysqli_error()を介して取得できます。
Mysqli :: release_savepointを使用してトランザクションとセーブポイントを管理する方法を示す例を示します。
<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">"username"</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>->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__">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">"SAVEPOINT savepoint1"</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 users (name, email) VALUES ('John Doe', '[email protected]')"</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">"SAVEPOINT savepoint2"</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 orders (user_id, product) VALUES (LAST_INSERT_ID(), 'Laptop')"</span></span><span>);
</span><span><span class="hljs-comment">// ここにエラーがあるとします,ロールバックする必要がありますsavepoint1</span></span><span>
</span><span><span class="hljs-comment">// ロールバックしたい場合savepoint1,利用可能ROLLBACK TO SAVEPOINT声明</span></span><span>
</span><span><span class="hljs-comment">// $mysqli->query("ROLLBACK TO SAVEPOINT savepoint1");</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__">release_savepoint</span></span><span>(</span><span><span class="hljs-string">"savepoint1"</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><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>
上記のコードで:
SavePointを使用してSavePointを作成します。
mysqli :: release_savepointを使用してsavepoint1をリリースします。これは、このセーブポイントが不要になったことを示しています。
トランザクションが失敗した場合、ロールバックを介してSavePointにSavePointにロールバックしたり、ロールバックを使用してトランザクション全体をロールバックしたりできます。
mysqli :: release_savepointの主な機能は、必要に応じて必要でないセーブポイントをリリースし、リソースのタイムリーなクリーニングを確保することです。特に複雑なトランザクションを処理する場合、複数の保存ポイントが設定される場合があります。これらの保存ポイントがリリースされない場合、システムリソースを占有し続け、データベースのパフォーマンスに影響します。したがって、 mysqli :: release_savepointを使用して、不要な保存ポイントをリリースすることは、リソースを管理する良い方法です。
リソースの保存:リソースの無駄を避ける必要がなくなった保存ポイントをリリースします。
効率の向上:トランザクションのセーブポイントの数を減らすと、トランザクションの実行効率が向上します。
強化された保守性:長いトランザクションでは、トランザクション管理は、必要な保存ポイントをリリースすることにより明確になります。
mysqli :: release_savepoint関数は、データベーストランザクションのロールバックメカニズムにおいて重要な役割を果たします。リソースの使用量を削減し、不要なセーブポイントを解放するのに役立つことにより、トランザクションの効率を向上させます。複雑なデータベース操作を扱う場合、SavePointsとrelease_SavePointの合理的な使用は、コードの読みやすさ、保守性、パフォーマンスを大幅に改善できます。