カテゴリ: CodeIgniter 更新日: 2026/05/03

CodeIgniterでトランザクション処理をマスター!初心者向けデータベース操作ガイド

CodeIgniterでトランザクション処理を行う方法
CodeIgniterでトランザクション処理を行う方法

先生と生徒の会話形式で理解しよう

生徒

「CodeIgniterで、銀行の振り込みみたいに『Aさんの残高を減らして、Bさんの残高を増やす』という2つの処理をセットで行いたいときはどうすればいいですか?」

先生

「それは『トランザクション』という機能を使うのが一番です。どちらか一方が失敗したら、全部なかったことにできる仕組みなんですよ。」

生徒

「もし片方だけ成功して、もう片方がエラーになったらお金が消えちゃいますもんね。具体的にどうやって書くんですか?」

先生

「CodeIgniterなら、数行のコードを足すだけで安全に処理できます。では、基本から順番に解説していきますね!」

1. トランザクションとは?初心者にわかりやすく解説

1. トランザクションとは?初心者にわかりやすく解説
1. トランザクションとは?初心者にわかりやすく解説

プログラミングやデータベースの世界でよく聞く「トランザクション(Transaction)」とは、一言で言うと「複数の処理を1つのまとまりとして扱うこと」です。この言葉は「取引」という意味を持っています。

例えば、あなたがコンビニでお弁当を買うシーンを想像してください。「店員にお金を渡す」という処理と、「店員からお弁当を受け取る」という処理は、必ずセットで行われなければなりません。もし、お金を払ったのにお弁当がもらえなかったり、逆にお弁当をもらったのにお金を払わなかったりしたら、取引は成立しませんよね。

このように、「全部成功するか、全部失敗(最初からなかったことにする)か」のどちらかしかない状態を作るのがトランザクションの役割です。ITの世界では、データの整合性(矛盾がない状態)を保つために非常に重要な仕組みとなっています。CodeIgniterというフレームワークを使うと、この複雑な仕組みを驚くほど簡単に実装することができます。

2. なぜトランザクションが必要なのか?失敗のリスクを考える

2. なぜトランザクションが必要なのか?失敗のリスクを考える
2. なぜトランザクションが必要なのか?失敗のリスクを考える

データベースを操作する際、多くの場合は1つの命令(SQL)で済みますが、中には連鎖的な操作が必要な場面があります。代表的なのが、ブログ記事の投稿機能です。「記事本文を保存する」のと同時に「アクセス数を数えるテーブルを初期化する」といった処理を行う場合です。

もし、記事の保存には成功したけれど、その直後にサーバーの電源が切れたり、ネットワークエラーが発生してアクセス数テーブルの更新に失敗したりしたらどうなるでしょうか?データベースの中には「本文はあるけれど、付随するデータが存在しない」という中途半端なデータが残ってしまいます。これが積み重なると、システム全体が動かなくなる「バグ」の原因になります。

トランザクションを使えば、エラーが起きた瞬間に「今の操作は全部キャンセル!」と命令(これをロールバックと言います)を出すことができ、データベースを綺麗な状態のまま守ることができるのです。Web開発者を目指すなら、必ず習得しておきたい必須スキルと言えます。

3. CodeIgniterでの基本の書き方(自動モード)

3. CodeIgniterでの基本の書き方(自動モード)
3. CodeIgniterでの基本の書き方(自動モード)

CodeIgniterには、初心者にも扱いやすい「自動トランザクション」という機能が備わっています。これは、処理の始まりと終わりを宣言するだけで、内部でエラーが起きたかどうかをCodeIgniterが自動的に判断してくれる便利な仕組みです。

以下のコードは、データベースに2つのデータを追加する例です。もし、どちらか一方でも失敗すれば、両方の追加が自動で取り消されます。


// トランザクションの開始
$this->db->trans_start();

// 1つ目の処理:ユーザーの新規作成
$this->db->insert('users', ['name' => '田中太郎', 'email' => 'tanaka@example.com']);

// 2つ目の処理:プロフィール情報の作成
$this->db->insert('profiles', ['user_id' => 1, 'bio' => 'こんにちは!']);

// トランザクションの終了(ここで自動的に成否を判断して確定か取消を行う)
$this->db->trans_complete();

このコードで重要なのは、trans_start()trans_complete() で処理を挟むことです。これにより、挟まれた間の処理が「一つのグループ」として認識されます。

4. 成功と失敗を判定する方法

4. 成功と失敗を判定する方法
4. 成功と失敗を判定する方法

自動トランザクションが終わった後、その処理が最終的に成功したのか、それとも失敗して取り消されたのかを知りたい場合があります。例えば、ユーザーに「登録が完了しました」と表示するか、「エラーが発生したのでやり直してください」と表示するかを分ける時です。

CodeIgniterでは trans_status() という関数を使って、結果を「真(true)」か「偽(false)」で受け取ることができます。


$this->db->trans_start();

$this->db->query('UPDATE accounts SET balance = balance - 1000 WHERE id = 1');
$this->db->query('UPDATE accounts SET balance = balance + 1000 WHERE id = 2');

$this->db->trans_complete();

if ($this->db->trans_status() === FALSE) {
    // 失敗した場合の処理
    echo "処理に失敗しました。データは更新されていません。";
} else {
    // 成功した場合の処理
    echo "処理は正常に完了しました!";
}

このように、if文と組み合わせることで、ユーザーに対して親切なメッセージを出すことができるようになります。プログラミング未経験の方でも、この「もし〜なら」という考え方に慣れることが大切です。

5. 自分で細かく制御する「手動モード」

5. 自分で細かく制御する「手動モード」
5. 自分で細かく制御する「手動モード」

「自動モード」は便利ですが、時にはもっと細かく、自分のタイミングで確定(コミット)したり、取り消したり(ロールバック)したい場合があります。これを「手動トランザクション」と呼びます。

手動モードでは、自分でエラーをチェックして、明示的に命令を出します。少し難しく感じるかもしれませんが、仕組みは単純です。


// トランザクションを開始する
$this->db->trans_begin();

// データの更新処理
$this->db->query("UPDATE inventory SET stock = stock - 1 WHERE item_id = 100");

// 何らかの条件でエラーを判定
if ($this->db->trans_status() === FALSE) {
    // 失敗したので、全てをなかったことにする(ロールバック)
    $this->db->trans_rollback();
    echo "在庫更新に失敗したため、注文を取り消しました。";
} else {
    // 成功したので、結果をデータベースに永久保存する(コミット)
    $this->db->trans_commit();
    echo "注文が確定しました!";
}

コミット(Commit)とは、変更を確定させるハンコを押すようなイメージです。逆にロールバック(Rollback)は、書いた書類をシュレッダーにかけて捨てるイメージですね。この2つの言葉はIT業界でよく使われる専門用語なので覚えておきましょう。

6. テストモードで安全に開発する方法

6. テストモードで安全に開発する方法
6. テストモードで安全に開発する方法

実際にデータを書き換えるのが怖い場合、CodeIgniterには「テストモード」という便利な機能があります。これを使うと、コードを最後まで実行しても、実際にはデータベースに保存されず、必ずロールバック(取り消し)される状態になります。

開発中のプログラムが正しく動くか、データが壊れないか不安なときに非常に役立ちます。


// トランザクションをテストモードで開始(trueを渡す)
$this->db->trans_start(TRUE); 

$this->db->query('INSERT INTO logs (message) VALUES ("テスト送信")');

// trans_completeを呼び出しても、必ずロールバックされます
$this->db->trans_complete();

echo "テスト完了。データベースには保存されていません。";

このように、trans_start(TRUE) とカッコの中に TRUE を入れるだけで、安全に練習や実験ができるようになります。初心者の方は、まずこのテストモードで挙動を確認することをおすすめします。

7. データベース設定とトランザクションの関係

7. データベース設定とトランザクションの関係
7. データベース設定とトランザクションの関係

トランザクションを使うためには、実はデータベース側の設定も重要です。例えば、MySQLという有名なデータベースを使っている場合、テーブルの種類(ストレージエンジンと言います)が「InnoDB」になっている必要があります。

古い形式の「MyISAM」という設定だと、CodeIgniter側でトランザクションのコードを書いても、無視されてそのまま保存されてしまいます。もし「コードは正しいのにロールバックされない!」と困ったときは、データベースの管理画面(phpMyAdminなど)を見て、テーブルの形式がどうなっているか確認してみてください。

パソコンの操作に不慣れな方には少し難しいかもしれませんが、「入れ物(データベース)の種類によっては魔法(トランザクション)が効かないことがある」とだけ覚えておけば十分です。

8. 複雑な条件分岐とトランザクションの応用

8. 複雑な条件分岐とトランザクションの応用
8. 複雑な条件分岐とトランザクションの応用

実際のアプリ制作では、データベースの操作以外にも、ファイルのアップロードやメール送信などが絡むことがあります。トランザクションの範囲内でこれらをどう扱うかは、プログラマの腕の見せ所です。

基本的には、「データベースの更新がすべて成功したことを確認してから、メールを送信する」という流れにするのが安全です。トランザクションの途中でメールを送ってしまうと、データベースの更新が失敗してロールバックしたのに、ユーザーには「完了メール」が届いてしまうというチグハグなことが起こるからです。

プログラムの流れ(フロー)を紙に書いて整理してみるのも、初心者が上達する近道ですよ。

9. トランザクション使用時の注意点

9. トランザクション使用時の注意点
9. トランザクション使用時の注意点

非常に便利なトランザクションですが、使いすぎには注意が必要です。トランザクションを実行している間、データベースはそのデータを他の人が書き換えられないように「ロック(鍵)」をかけることがあります。

あまりにも長い時間、大量のデータを処理するトランザクションを走らせると、他のユーザーがそのテーブルを使えなくなり、Webサイト全体の動きが重くなってしまうことがあります。トランザクションは「必要な最小限の範囲」で使うのが、プロのエンジニアへの第一歩です。

また、トランザクションの入れ子(トランザクションの中でさらにトランザクションを始めること)もCodeIgniterはサポートしていますが、最初のうちは混乱を避けるため、シンプルな1重のトランザクションから練習していきましょう。

カテゴリの一覧へ
新着記事
New2
Symfony
SymfonyでAPI向けにカスタムエラーメッセージを返す方法を解説!初心者でも安心のバリデーション基礎
New3
Symfony
Symfonyの動的フォームフィールド追加・削除を完全ガイド!初心者でもわかるフォーム操作入門
New4
Laravel
LaravelのMailableクラスの使い方を完全解説!初心者でもできるメール送信管理
人気記事
No.1
Java&Spring記事人気No1
CodeIgniter
CodeIgniterのセッション管理を徹底解説!値を保存・取得する基本操作
No.2
Java&Spring記事人気No2
Laravel
Laravelのnow()・today()関数の使い方完全ガイド!初心者でもわかる日時処理と日付操作
No.3
Java&Spring記事人気No3
Symfony
Symfony Twig入門|条件分岐とループをやさしく理解するテンプレート活用術
No.4
Java&Spring記事人気No4
Laravel
Laravelのabort()関数でエラーを返す方法!初心者向け完全ガイド
No.5
Java&Spring記事人気No5
Laravel
Laravelの日付バリデーションの使い方を完全解説!初心者でも安心の丁寧ガイド
No.6
Java&Spring記事人気No6
Laravel
Laravelの@eachディレクティブで簡単に繰り返しテンプレートを表示する方法
No.7
Java&Spring記事人気No7
Laravel
Laravelのインストール方法まとめ!ComposerとLaravel Installerの使い方
No.8
Java&Spring記事人気No8
Symfony
Symfonyのコントローラで例外処理を追加する方法をやさしく解説!初心者でも安心して学べる