2012年1月11日水曜日

トランザクション

トランザクションとは、
関連する複数の処理を一つの処理単位としてまとめたもの。金融機関のコンピュータシステムにおける入出金処理のように、一連の作業を全体として一つの処理として管理するために用いる。
GAEのデータベースは何でもトランザクションになっていたということだな。
トランザクションを使うと複数のクエリをまとめて1つの処理として扱うことができる。処理の途中でエラーになって処理を取り消したいような場合はROLLBACKをすることで変更内容を元に戻すことができる。
とみぞーノートに書いてある。 とみぞーノートを見ると、トランザクションを開始して、コミットするまでは、他の誰かがデータを参照してもトランザクション中の人が操作しているデータは見えないようだ。コミットするとトランザクションが終了するようだ。データを全部元に戻すには、ロールバックするらしい。単純な仕組みではある。確かinnoDBというのはトランザクションが使えるし、ロックが行単位の為、デッドロックになることは少ないとかなんかの雑誌に書いてあったな。

cakePHPでトランザクション

(※以下の情報は古かったのでcakePHP1.3の場合はここのやり方になります)

cakePHPでのトランザクションの使い方がこのページに書いてある。まずはapp/model/以下にあるapp_model.phpに以下を追加する必要があるらしい。

function begin()
{
    $db =& ConnectionManager::getDataSource($this->useDbConfig);
    $db->begin($this);
}
    
function commit()
{
    $db =& ConnectionManager::getDataSource($this->useDbConfig);
    $db->commit($this);
}
    
function rollback()
{
    $db =& ConnectionManager::getDataSource($this->useDbConfig);
    $db->rollback($this);
}

そして、実際に使う様がこのページに載っている。cakePHP1.3の場合だそうだ。

$this->Event->begin(); // トランザクションの開始
if($this->Event->save($this->data)){
    $this->Event->commit(); // コミット
    // 登録できたらリダイレクト
    $this->redirect('.');
}else{
    $this->Event->rollback(); // ロールバック
    $this->Session->setFlash('データの保存に失敗しました');
}

あとで試してみよう。

0 件のコメント:

コメントを投稿