TOOL更新_DbManagerに関連する調整
TOOL更新_DbManagerに関連する調整
1.シーケンスをシーケンステーブルを使って作っている。これによりいろいろな種類の主キーを作れる。このためにシーケンステーブルのロック、begin、commitが必要になる。今までは一つのDBコネクションでこまめにbegin、commitをかけていた。これを二つのコネクションをつくり、一つをシーケンステーブル専用に使おうというアイデア。
2.もう一つのコネクションは処理の最初にbeginして処理の最後にcommitするようにした。(途中でやるのはやめた。1箇所にした。)そこで、exceptionが出たときはrollbackするようにした。これでコーディング漏れを防ぐことができる。(・・・selectしかないのにbegin,commitしてしまうというというのとバータにはなるけど。)
・まだ、調整中なので。過去ブログへの修正はまだ、あとで。
■ ControllerABase.php 修正。 要点のみ抜粋
☆ DB接続(シーケンス作成用)を作った。_dbBegin()、_dbCommit()、_dbRollback()メソッドを作った。
protected function _preDo() ・・・ $this->_db = DbManager::getInstance($DSN_ZEND, 'uid'); // DB接続 <<追加>> $this->_db2 = DbManagerForSeq::getInstance($DSN_ZEND, 'uid'); // DB接続(シーケンス作成用) ・・・ } // DB begin protected function _dbBegin() { if ($this->_db != null) { $this->_db->beginTransaction(); } } // DB commit protected function _dbCommit() { if ($this->_db != null) { $this->_db->commit(); } } // DB rollback protected function _dbRollback() { if ($this->_db != null) { $this->_db->rollback(); } }
■ControllerABaseExt.php 修正 要点のみ抜粋
☆$this->_dbBegin();、$this->_dbCommit();を入れたいがための修正。途中でredirectしていたのも、やめて、途中で$this->_redirectUrlに飛び先を入れといて、ここまで持ってきてからredirectするようにした。
protected function _indexActionSub() { // 親クラスでabstractメソッドにしてある。親クラスのindexAction()から呼ばれる。 <<追加>> // DB begin $this->_dbBegin(); ・・・ // DB commit $this->_dbCommit(); switch($this->_mode) { case 'ins': // 登録 case 'upd': // 変更 case 'detail': // 詳細 case 'list': // リスト break; default: if ($this->_redirectUrl != null) { $this->_redirect($this->_redirectUrl); } exit; } // HTML出力 $this->_outHtml(); }
■ControllerBase.php 修正 要点のみ抜粋
☆以下のようにExceptionに $this->_dbRollback();をいれた。 _dbRollback()メソッドも作った。(ここでは中身はないが)
public function indexAction() ・・・ } catch (AppException $e) { ・・・ // DB rollback(継承先でDB使わないときは何もしない) $this->_dbRollback(); ・・・ // プログラム内のシステム用例外 } catch (SysException $e) { ・・・ // DB rollback(継承先でDB使わないときは何もしない) $this->_dbRollback(); ・・・ // ZENDなどが出す例外 } catch (Exception $e) { ・・・ // DB rollback(継承先でDB使わないときは何もしない) $this->_dbRollback(); ・・・ } } // DB rollback:継承先でDBを使う場合、rollbackを行う。 // (継承先でDB使わないときは何もしない) protected function _dbRollback() { }
■DbManagerForSeq.php 新規
DbManagerForSeq.phpとDbManager.phpの最新はhttp://d.hatena.ne.jp/kazpgm/20100309/1268152282 (TOOL更新_DBマネージャクラス。うごいたので。ここに更新する。)参照
■DbManager.php 修正 要点のみ抜粋
☆beginTransaction()、commit()、rollBack()メソッドを作った。SQLログを出したいので。
// DB begin public function beginTransaction() { $sql = 'begin'; $this->_outSqlLog($sql, 'beginTransaction'); return $this->_db->query($sql); } // DB commit public function commit() { $sql = 'commit'; $this->_outSqlLog($sql, 'commit'); return $this->_db->query($sql); } // DB rollback public function rollBack() { $sql = 'rollback'; $this->_outSqlLog($sql, 'rollBack'); return $this->_db->query($sql); }
■シーケンス作成例
☆AppDbFunctions::getDbSeqは自動作成◎自動生成される。・・・以下はテストで試したもの(t_loginテーブルはシーケンス持っていないので、t_corpテーブルのものを単独で動かしてみた。)。
$test = AppDbFunctions::getDbSeq($this->_db2, 't_corp', $_REQUEST); // 法人ID
■LogininfoAUtil.php 修正 要点のみ抜粋
☆途中でbegin、commitしなくした。
// $sql = 'begin'; // $db->dbQuery($sql); $db->dbInsert('m_logininfo', $columns); // $sql = 'commit'; // $db->dbQuery($sql); ・・・ // $sql = 'begin'; // $db->dbQuery($sql); $db->dbUpdate('m_logininfo', $columns, array('login_id = '. $db->dbQuote( $o['login_id'] ))); // $sql = 'commit'; // $db->dbQuery($sql); ・・・ // $sql = 'begin'; // $db->dbQuery($sql); $rtn = $db->dbDelete('m_logininfo', array('login_id = '. $db->dbQuote( $o['login_id'] ) )); if (1 > $rtn) { // 更新なしの場合 // $sql = 'commit'; // $db->dbQuery($sql); return '指定されたログイン情報は削除されています。' . ' ログインID=' . $o['login_id'] ; // 削除されている } // $sql = 'commit'; // $db->dbQuery($sql);
5/26 21:00-3:30 きになっていた、2コネクション。ともにうまく動いた。
SQLログ2コネクション混ざり合っている。のを、何とかしよう。ログのphpファイル名がフルパス(長いのでじゃま)なのを何とかしよう。また、あとで。
6/5 2コネクションうまくいっていなかった。今日修正した。上記にDbManagerForSeq.phpとDbManager.phpの最新URLを書いた。