トランザクションの基本概念は「すべて成功するか、すべて失敗する」です。トランザクションの操作が失敗した場合、トランザクション内のすべての操作が巻き戻されます(取り消されます)。トランザクションには通常、次の4つの特性が含まれています(酸の原理)。
Atomicity :トランザクションのすべての操作は完了するか、完了しません。
一貫性:トランザクションは、ある一貫した状態から別の状態にデータベースを遷移する必要があります。
分離:取引の実行は、他のトランザクションによって妨害されるべきではありません。
耐久性:トランザクションがコミットされると、データは永続的である必要があり、失われません。
MySQLデータベースでは、 INNODBはトランザクションをサポートしているため、主にINNODBストレージエンジンに依存していますが、 Myisamなどの他のストレージエンジンはそうではありません。
PHPでは、 mysqli :: begin_transaction関数を使用して、トランザクションを明示的に開始します。この関数を呼び出した後、MySQLは、開発者がcompit()またはrollback()を明示的に呼び出すまで、すぐにデータを送信またはロールバックすることなくトランザクションを開始します。
<span><span>mysqli::</span><span><span class="hljs-title function_ invoke__">begin_transaction</span></span><span>();
</span></span>
関数にはパラメーターがなく、戻り値は無効です。つまり、結果は返されません。主にトランザクションを開始するために使用され、その後、一連のデータベース操作を実行できます。
データベースへの接続:最初に、 mysqli_connectまたはオブジェクト指向のメソッドを介してデータベース接続を確立する必要があります。
トランザクションの開始: begin_transactionを呼び出してトランザクションを開始します。
SQL操作の実行:データの挿入、更新、削除など、トランザクションで一連のSQL操作を実行します。
コミットまたはロールバック:実行結果に基づいてコミットするかロールバックかを決定します。
<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-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">// 埋め込む SQL 動作します</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 ('Alice', '[email protected]')"</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 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>-></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>
トランザクションを使用する場合、エラー処理が重要です。通常、トライキャッチステートメントを通じて例外をキャッチし、エラーが発生したときにトランザクションをロールバックします。これにより、操作が途中で故障した場合でも、以前のすべての操作が取り消され、データベースの一貫性が維持されます。
上記のコードでは、SQL操作(データベース制約競合など)を実行するときにエラーが発生すると仮定すると、 Catchブロックはこのエラーをキャッチし、 $ mysqli- lollback()を介してすべてのデータベース操作をロールバックします。
コミットトランザクション:トランザクション内のすべての操作が正常に実行された場合、 Commit()メソッドを呼び出してトランザクションを送信できます。つまり、すべての変更がデータベースに永久に保存されます。
ロールバック:トランザクションでエラーが発生した場合、ロールバック()メソッドを呼び出して、前に実行されたすべてのSQL操作を取り消し、トランザクションが開始される前にデータベースを状態に復元します。
コミットメントとロールバックは、トランザクション制御の鍵であり、トランザクションの最終結果を決定します。
<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-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>
自動送信モード:MySQLは、デフォルトで自動送信モードを有効にします。つまり、各SQLステートメントが実行された直後に送信されます。トランザクションを使用する場合は、自動委員会モードを手動で無効にする必要があります。自動提出は、mysqli-> autocommit(false)を介して無効にすることができます。
例:
<span><span><span class="hljs-variable">$mysqli</span></span><span>-></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は、実際のネストされたトランザクションをサポートしていません。あるトランザクションで別のトランザクションを開始した場合、内部トランザクションのコミットまたはロールバックは外部トランザクションに影響しません。
関連タグ:
mysqli