# トランザクションを使用する一般的なワークフロー:`PDO_MySQL`
+ **`try-catch`** を使用してトランザクションを実行する
  + **`try`**
    + トランザクション開始:**`$dbhandle->beginTransaction()`**
    + **`DML`** を実行する
    + コミット:**`$dbhandle->commit()`**
  + **`catch`**
    + **`try`**
      + `DML` が失敗した後にすべきこと
      + ロールバック:**`$dbhandle->rollback()`**
    + **`catch`**
      + ロールバックを処理できませんでした

------------------------------------------------------------
プログラムは `beginTransaction()` メソッドを呼び出してトランザクションを開始します。

`DML` ステートメントはトランザクションで実行されます。成功すると、`commit()` メソッドによってデータベースに永続化されます。

最初の try ブロック内の `UPDATE` ステートメントのいずれかが失敗した場合、プログラムは例外を発生させて `rollback()` を呼び出します。


PDO_MySQL の例:
```
  <?php
  echo "PDO_MySQL Example - Transaction Control" . "<p>";

  try {
    $dsname = "mysql:host=127.0.0.1;port=4000;dbname=test";
    $dbhandle = new PDO($dsname, "root", "");
    print "Connection established.<p>";
    $dbhandle->exec("DROP TABLE IF EXISTS t_php");
    $dbhandle->exec("CREATE TABLE t_php (id BIGINT PRIMARY KEY AUTO_RANDOM, name VARCHAR(20), buffered_by_default char(1))");
    $num = $dbhandle->exec("INSERT INTO t_php (name)"
      . " VALUES "
      . "('mysqli'), ('PDO_MySQL')");
    echo $num . " rows(s) inserted.<p>";

    try {
      $dbhandle->beginTransaction();
      echo "Transaction begin." . "<p>";
      $dbhandle->exec("UPDATE t_php SET buffered_by_default = 'Y' WHERE name = 'mysqli'");
      $dbhandle->exec("UPDATE t_php SET buffered_by_default = 'N' WHERE name = 'PDO_MySQL'");
      $dbhandle->commit();
      echo "Transaction end." . "<p>";
    } catch (Exception $e) {
      print("Transaction failed, error goes here:<p>");
      print($e->getMessage() . "<p>");
      try {
        $dbhandle->rollback();
      } catch (Exception $er) {
        print("Unable to roll back. Error was:<p>");
        print($er->getMessage() . "<p>");
      }
    }
    $dbhandle->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
    $statementhandle = $dbhandle->query("SELECT name, buffered_by_default FROM t_php");
    while ($row = $statementhandle->fetch(PDO::FETCH_ASSOC)) {
      printf("Name: %s, Buffered Result Set by Default: %s<p>", $row['name'], $row['buffered_by_default']);
    }
    print "Connection terminated.";
  } catch (PDOException $err) {
    die($err);
  }

  ?>
```
