CodeIgniter トランザクション
CodeIgniter トランザクションは、単一トランザクションの一部として複数のデータベース操作を実行するメカニズムを提供します。これにより、すべての操作が正常に完了するか、エラーが発生した場合はすべてロールバックされることが保証されます。
このシナリオでは、トランザクション ブロック内で外部関数を呼び出していますが、これらの関数でエラーが発生した場合、トランザクションは実行されません。必要に応じてロールバックします。これは、外部関数がトランザクション状態にアクセスできないためです。
解決策の 1 つは、外部関数でエラーをキャッチし、必要に応じて手動でロールバックを実行することです。例:
<code class="php">try { $this->db->trans_start(); $this->utils->insert_function($data); $this->utils->update_function2($test); $this->db->trans_complete(); } catch (Exception $e) { $this->db->trans_rollback(); }</code>
ただし、より堅牢な解決策は、データベース操作を個々のモデル メソッド内にカプセル化することです。これにより、より適切な組織化と一元的なエラー処理が可能になります。この場合、insert_function 関数と update_function2 関数をモデルに移動し、モデル メソッド内でトランザクションを処理できます。
TransactionExampleModel.php
<code class="php">class TransactionExampleModel extends CI_Model { public function insertData($data) { $this->db->trans_start(); $this->db->insert('table_name', $data); if ($this->db->trans_status() === FALSE) { $this->db->trans_rollback(); return FALSE; } $this->db->trans_commit(); return TRUE; } public function updateData($data, $id) { $this->db->trans_start(); $this->db->where('id', $id); $this->db->update('table_name', $data); if ($this->db->trans_status() === FALSE) { $this->db->trans_rollback(); return FALSE; } $this->db->trans_commit(); return TRUE; } }</code>
次に、コントローラーでは、トランザクション ブロック内でモデル メソッドを呼び出すことができます。
<code class="php">$this->load->model('TransactionExampleModel'); $this->db->trans_start(); $result1 = $this->TransactionExampleModel->insertData($data); $result2 = $this->TransactionExampleModel->updateData($test, $id); $this->db->trans_complete();</code>
このアプローチにより、CodeIgniter アプリケーションでトランザクションを管理するための、より集中化された堅牢な方法が提供されます。
以上が外部関数を呼び出すときに CodeIgniter でトランザクションを確実にロールバックするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。