topic: db (PDO / SQL / マルチDB) / ch08 — トランザクション / 演習 01

📝 ドリル 01 — 2 件 INSERT を commit

問題

accounts テーブルに次の 2 件を 1 つのトランザクションで INSERT してから commit し、 最後に "commit" と出力し、続けて id 昇順で "{id}: {balance}" を全件出してください。

追加する 2 件:

  • id = 10, balance = 1000
  • id = 11, balance = 2000

初期データは空 (テーブルだけある状態)。

期待される出力:

commit
10: 1000
11: 2000

採点

php scripts/grade.php topics/11-db/ch08-transactions/drill/01-commit-success/

ヒント

  • $pdo->beginTransaction(); でトランザクション開始
  • $pdo->exec("INSERT INTO accounts (id, balance) VALUES (10, 1000)"); を 2 回
  • $pdo->commit(); で確定
  • echo "commit\n"; を出す
  • 最後に SELECT id, balance FROM accounts ORDER BY id を foreach で出力

テストケース

期待される出力

commit
10: 1000
11: 2000

📄 starter.php(雛形)

このコードから書き始めてください。

<?php

$pdo = new PDO('sqlite:' . getenv('DOJO_DB_PATH'));
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// TODO: beginTransaction でトランザクションを開始する

// TODO: (id=10, balance=1000) と (id=11, balance=2000) を INSERT する

// TODO: commit で確定する

// TODO: "commit" と出力する

// TODO: id 昇順で全件を "{id}: {balance}" の形式で出力する
✅ 解答例を見る(自分で解いてから)
<?php

$pdo = new PDO('sqlite:' . getenv('DOJO_DB_PATH'));
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$pdo->beginTransaction();
$pdo->exec("INSERT INTO accounts (id, balance) VALUES (10, 1000)");
$pdo->exec("INSERT INTO accounts (id, balance) VALUES (11, 2000)");
$pdo->commit();

echo "commit\n";

foreach ($pdo->query("SELECT id, balance FROM accounts ORDER BY id") as $row) {
    echo "{$row['id']}: {$row['balance']}\n";
}