PDOのトランザクション周りについてメモ

ちょっと調べたのをつらつら。

トランザクションって

  • コミット時に他の接続の干渉を受けないようにするためのもの
  • トランザクション内の作業は(コミット前なら)いつでも自動的に取り消すことができる
    • エラー処理が分かりやすくなる
  • 実装としては、変更内容を一時的に溜めて、それらを一気に適用するようになっている
    • これによって、更新処理の性能が高速になる

PDOのトランザクション

  • PDOで最初に接続をオープンした際は「自動コミット」モードで動作する
  • トランザクションを使用する場合、PDO::beginTransaction()で初期化する必要がある
  • トランザクションを終了させるには、トランザクション内のコードが成功したかどうかで、PDO::commit()あるいはPDO::rollBack()を使用する
  • スクリプトが終了したり接続が閉じられた場合、もし処理が完了していないトランザクションがあればPDOが自動的にロールバックする
    • PDO::beginTransaction()で開始されていないとダメ
  • MySQLではCREATE TABLEやDROP TABLEは自動的にトランザクションをコミットするので、トランザクションのどの変更もロールバックされない
  • ラージオブジェクトはPDO::PARAM_LOBでおk
  • MySQLでは、$pdo->exec( "BEGIN TRANSACTION" )とする必要が?
    • PHP5.1からPDO::beginTransaction()でおk
  • PDO::query()はPDOStatementオブジェクトを返す
    • 全てのデータを取得する前にPDO::query()を再度コールするとエラー
    • PDOStatement::closeCursor()で関連づけられたリソースを解放しないとダメ
  • PDOStatement::prepare()は、MySQL5.1.17未満だとクエリキャッシュが効かないみたい
  • like検索時の注意
    • where like username=%:name% としてもダメ
    • $name = '%hogehoge%' とする
  • フィールド名は、MySQLの場合「`」、Postgresの場合「"」で囲む