CodeIgniter、MySQLのトランザクション管理について教えてください。
###実現したいこと
コントローラーの開始でトランザクションを開始し、コントローラーの終わりでトランザクションをコミット / ロールバック。
チームで開発をする際にメンバーのスキルによって、漏れが発生してしまうことを防ぐために、上位で制御を行いたいです。
###回答いただきたいこと
下記に示すコード(__destruct()
でのトランザクション処理)で問題はないか。
__destruct()
のタイミングでコネクションがなくなる(closeされる)ことがあり得るのかが気になっています。
###該当のソースコード
lang
1class MY_Controller extends CI_Controller { 2 public $trans_failure = FALSE; 3 private $_trans_status = FALSE; 4 5 public function __construct() 6 { 7 parent::__construct(); 8 $this->_trans_start(); 9 } 10 11 public function __destruct() 12 { 13 parent::__destruct(); 14 $last_error = error_get_last(); 15 if (isset($last_error) && 16 ($last_error['type'] & (E_ERROR | E_PARSE | E_CORE_ERROR | E_CORE_WARNING | E_COMPILE_ERROR | E_COMPILE_WARNING))) 17 { 18 // Exceptionのためロールバック 19 $this->trans_failure = TRUE; 20 } 21 22 $this->_trans_complete(); 23 } 24 25 private function _trans_start() 26 { 27 if ($this->db->trans_begin()) 28 { 29 $this->_trans_status = TRUE; 30 } 31 } 32 33 private function _trans_complete() 34 { 35 if ($this->_trans_status === FALSE) 36 { 37 return; 38 } 39 40 if ($this->trans_failure === TRUE) 41 { 42 $this->db->trans_rollback(); 43 $this->_trans_status = FALSE; 44 return; 45 } 46 47 $this->db->trans_commit(); 48 $this->_trans_status = FALSE; 49 } 50}
基本的にはコントローラーの最後でコミットとし、排他チェックなどによる意図的なロールバックは$this->trans_failure = FALSE;
をすることを想定しています。
###試したこと
hookの機能を利用し、post_controller_constructor
でトランザクションの開始、post_controller
でトランザクションの完了処理を試しました。
url_helperのredirect()
などでexit
した場合に、トランザクションの完了処理が呼ばれず、結果としてロールバックされてしまいました。
###補足情報(言語/FW/ツール等のバージョンなど)
CodeIgniter 3.1.4
MySQL
よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。