PDOのトランザクション周りについてメモ
ちょっと調べたのをつらつら。
トランザクションって
- コミット時に他の接続の干渉を受けないようにするためのもの
- トランザクション内の作業は(コミット前なら)いつでも自動的に取り消すことができる
- エラー処理が分かりやすくなる
- 実装としては、変更内容を一時的に溜めて、それらを一気に適用するようになっている
- これによって、更新処理の性能が高速になる
PDOのトランザクション
- PDOで最初に接続をオープンした際は「自動コミット」モードで動作する
- トランザクションを使用する場合、PDO::beginTransaction()で初期化する必要がある
- ドライバがトランザクションをサポートしていなければPDOExceptionがスローされる
- トランザクションを終了させるには、トランザクション内のコードが成功したかどうかで、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の場合「"」で囲む