# CodeIgniter ユーザガイド 日本語版 Version 1.7.2

ユーザガイドを検索

# トランザクション

CodeIgniterの抽象データベースでは、トランザクション・セーフなテーブルタイプ [ 訳注：テーブルの管理方式がトランザクションをサポートするものという意味 ] をサポートしているデータベースで トランザクション を利用することができます。MySQLでは、より一般的なMyISAMではなく InnoDB か BDB のテーブルタイプで実行されている必要があります。他のほとんどのデータベースでは、トランザクションはネイティブにサポートされています。

トランザクションについてあまり知らない場合は、利用中のデータベースのトランザクションについて学習するために、良いオンラインリソースを探すことをおすすめします。

## CodeIgniterのトランザクションに対するアプローチ

CodeIgniter のトランザクションに対するアプローチでは、ポピュラーなデータベースクラスであるADODBで使われている手順と大変よく似たものが採用されています。トランザクションの実行プロセスが非常に単純になるので、このアプローチを採用しています。ほとんどの場合、それは2行のコードが必要になるだけです。

従来は、クエリを絶えず追跡し、クエリの成否にもとづいて、コミット するか ロールバック するかを決めなければならないため、トランザクションの実装には多くの作業を必要としてきました。これは、入れ子になったクエリでは特に邪魔になります。対照的に、私たちは、自動的にそれら全部を実行するスマートなトランザクションシステムを実装しました (実際のところ利点はないですが、やりたければ手動でトランザクションを管理することもできます)。

## トランザクションの実行

トランザクションを使ってクエリを実行するには、次のように $this->db->trans_start() メソッドと $this->db->trans_complete() メソッドを使います:

``$this->db->trans_start();`
$this->db->query('SQL クエリ...');
$this->db->query('もう一つのクエリ...');
$this->db->query('さらにもう一つのクエリ...');
`$this->db->trans_complete();``

start メソッドと complete メソッドの間に、どれだけ多くのクエリを実行しても構いません。各クエリの成否により、それら全体がコミットまたはロールバックされます。

## 厳密な(Strict)モード

デフォルトではCodeIgniterは全てのトランザクションをStrictモードで実行します。Strictモードが有効な場合、複数のトランザクションのグループを実行している場合、ひとつのグループの実行が失敗すると他の全てのグループのトランザクションもロールバックされます。Strictモードが無効の場合、各グループは独立したものとして扱われ、ひとつのグループのトランザクションが失敗しても他のグループに影響を与えません。

Strictモードは以下のようにして無効にします:

`$this->db->trans_strict(FALSE);`

## エラーの管理

コミットが失敗した場合に、標準のエラーメッセージを見たい場合は、config/database.php ファイルでエラー報告機能を有効化できます。デバッグ機能がOFFの場合は、次のように自分でエラーを管理することもできます:

`$this->db->trans_start();
$this->db->query('SQL クエリ...');
$this->db->query('もう1つのクエリ...');
$this->db->trans_complete();
if (`$this->db->trans_status()` === FALSE)
{
// エラーを生成... または log_message() メソッドを使ってエラーをログに記録します
}`

## トランザクションの有効化

$this->db->trans_start() を使った瞬間にトランザクションが自動的に有効になります。トランザクションを無効にしたい場合は $this->db->trans_off() を実行することで無効化できます:

``$this->db->trans_off()`
$this->db->trans_start();
$this->db->query('SQLクエリ...');
$this->db->trans_complete();`

トランザクション機能が無効になっている場合、トランザクションなしにクエリが実行されたときのように、クエリは自動的にコミットされます。

## テストモード

オプションで、クエリが正しい結果になった場合でもロールバックされる "テストモード" のトランザクションを実行することができます。テストモードを使うには、$this->db->trans_start() メソッドの第1引数に `TRUE` を設定するだけです:

`$this->db->trans_start(`TRUE`); // クエリはロールバックされます
$this->db->query('SQL クエリ...');
$this->db->trans_complete();`

## トランザクションを手動で実行する

手動でトランザクションを実行したい場合は、次のようにすれば、手動で実行することができます:

`$this->db->trans_begin();
$this->db->query('SQL クエリ...');
$this->db->query('もう1つのクエリ...');
$this->db->query('さらにもう1つのクエリ...');
if ($this->db->trans_status() === FALSE)
{
$this->db->trans_rollback();
}
else
{
$this->db->trans_commit();
}
`

Note: 手動でトランザクションを実行するときは、$this->db->trans_start() ではなく `$this->db->trans_begin()` を必ず使用してください。