kazpgmの日記

『プログラム自動作成@自動生成』作成の日記

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を書いた。