トランザクション

CodeIgniter のデータベース抽象化は、トランザクションをサポートしているテーブルにおいてトランザクションを利用することができます。MySQLでは、InnoDB または BDB テーブルタイプで実行する必要があり、より一般的に使用されている MyISAM ではいけません。ほかのほとんどのデータベースプラットフォームではネイティブでサポートしています。

もしトランザクションに詳しくないなら、使用しているデータベースについてよいオンライン資料を探すことをおすすめします。下記の情報はトランザクションについて基礎的な理解があるものして進めます。

CodeIgniter のトランザクションへのアプローチ

CodeIgniter はトランザクションに対し、有名なデータベースクラスの ADODB の処理手順ととても良く似た方法でアプローチします。このアプローチを取る理由は、トランザクション処理をすばらしくシンプルにしてくれるからです。In most cases, all that is required is two lines of code.

伝統的には、トランザクションは実装に対し公正な処理を要求してきました。クエリを追跡し、クエリの成功失敗をもとに commit するか rollback するかを決定するためです。これはネストされたクエリで特に厄介な問題でした。それに対して、我々はスマートなトランザクションシステムを実装し、そのすべてを自動化させました(手動でトランザクションを管理することもできますが、利点はまったくありません)。

トランザクションの実行

トランザクションを使用してクエリを実行するには、$this->db->transStart() と $this->db->transComplete() メソッドをつぎのように使用します:

$this->db->transStart();
$this->db->query('SQL クエリ……');
$this->db->query('別のクエリ……');
$this->db->query('さらに別のクエリ……');
$this->db->transComplete();

You can run as many queries as you want between the start/complete functions and they will all be committed or rolled back based on the success or failure of any given query.

Strict モード

By default, CodeIgniter runs all transactions in Strict Mode. Strict モードが有効なとき、もし複数のトランザクショングループを走らせていたなら、1つでも失敗すればすべてのグループがロールバックされます。Strict モードが無効なとき、それぞれのグループは独立して扱われ、1つのグループの失敗は他のグループに影響を与えません。

Strict モードは次のようにして無効化できます:

$this->db->transStrict(false);

エラー管理

Config/Database.php ファイルでエラーレポーティングを有効にしている場合、コミットが成功しなかったなら標準エラーメッセージを見ることになるでしょう。デバッグが off になっていれば、エラーを次のように管理できます:

$this->db->transStart();
$this->db->query('SQL クエリ……');
$this->db->query('別のクエリ……');
$this->db->transComplete();

if ($this->db->transStatus() === FALSE)
{
        // エラーの生成…… もしくは log_message() 関数でエラーをログに記録します
}

Disabling Transactions

Transactions are enabled by default. If you would like to disable transactions you can do so using $this->db->transOff():

$this->db->transOff();

$this->db->transStart();
$this->db->query('AN SQL QUERY...');
$this->db->transComplete();

When transactions are disabled, your queries will be auto-committed, just as they are when running queries without transactions.

テストモード

オプションとして、トランザクションシステムを "テストモード" にすることができます。トランザクションはロールバックされます――たとえクエリが正常終了したとしても。To use test mode simply set the first parameter in the $this->db->transStart() function to TRUE:

$this->db->transStart(true); // クエリはロールバックされます
$this->db->query('SQL クエリ……');
$this->db->transComplete();

トランザクションの手動実行

手動でトランザクションを実行したいなら、つぎのようにします:

$this->db->transBegin();

$this->db->query('SQL クエリ……');
$this->db->query('別のクエリ……');
$this->db->query('さらに別のクエリ……');

if ($this->db->transStatus() === FALSE)
{
        $this->db->transRollback();
}
else
{
        $this->db->transCommit();
}

注釈

トランザクションの手動実行には $this->db->transBegin() を使っていることを確認してください。$this->db->transStart() では ありません