ご覧のとおり、CodeIgniter のデフォルトのトランザクション処理メカニズムでは、外部関数内でエラーが発生した場合に手動でロールバックする必要があります。この問題に対処するには、より包括的なアプローチが推奨されます。
1.モデルでのトランザクション処理のカプセル化:
CodeIgniter のアーキテクチャによれば、データベース操作は Model クラス内にカプセル化する必要があります。これにより、適切なデータ処理とモデル、ビュー、コントローラー (MVC) の分離が保証されます。外部関数は、ユーティリティまたはヘルパーとしてのみ機能する必要があります。
2.外部関数でのエラー トラップ:
insert_function や update_function2 などの外部関数内でエラー処理を実装し、エラーが発生した場合は FALSE を返します。これにより、トランザクションの完了時に自動ロールバックがトリガーされます。
例:
public function insert_function($data)
{
if (!$this->db->insert('transactions_exercices', $data)) {
return FALSE;
}
return TRUE;
}
3.コントローラでの例外処理:
トランザクションが開始されるコントローラでは、トランザクション中に発生する可能性のある例外を処理し、エラー メッセージの表示や例外のログ記録などの必要なアクションを実行します。
例:
try {
$this->db->trans_start();
// Call external functions
$result1 = $this->utils->insert_function($data);
$result2 = $this->utils->update_function2($test);
if ($result1 === FALSE || $result2 === FALSE) {
throw new Exception('An error occurred.');
}
$this->db->trans_complete();
} catch (Exception $e) {
$this->db->trans_rollback();
// Handle the exception...
}
注: 提供された解決策で説明されているように、独立したトランザクション グループを許可するには、トランザクション構成で厳密モードが無効になっていることを確認してください。
代替解決策:
または、エラー トラップと自動ロールバックを処理するカスタム トランザクション クラスを定義できます。このアプローチにより、すべてのトランザクションに対して一元的なエラー処理を提供できます。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3