12,925
回編集
(ページの作成:「== 概要 == PDO(PHP Data Objects)拡張モジュールは、PHPからデータベースにアクセスするための軽量で高性能なインターフェイスであ…」) |
(→持続的な接続) |
||
131行目: | 131行目: | ||
?> | ?> | ||
</syntaxhighlight> | </syntaxhighlight> | ||
<br><br> | |||
== トランザクションおよび自動コミット == | |||
トランザクション内で実行された作業は、データベースに安全に反映されることが保証されている。<br> | |||
トランザクションのコミット時は、他の接続の干渉を受けることはない。<br> | |||
また、未コミット時では、トランザクション内での作業はいつでも取り消すことができる。<br> | |||
<br> | |||
PDOクラスを使用してデータベースへ接続する場合、自動コミットモードで動作する。<br> | |||
自動コミットモードとは、データベースがトランザクションをサポートしている場合、クエリが暗黙的にトランザクションのもとで実行される。<br> | |||
データベースがトランザクションをサポートしていない場合、トランザクションを使用せずに実行される。<br> | |||
<br> | |||
トランザクションを使用する場合は、<code>PDO::beginTransaction</code>メソッドを使用して、トランザクションを初期化する必要がある。<br> | |||
使用しているドライバがトランザクションをサポートしていない場合、必ず、<code>PDOException</code>クラスがスローされる。<br> | |||
<br> | |||
トランザクションを終了する場合は、<code>PDO::commit</code>メソッドあるいは<code>PDO::rollBack</code>メソッドを使用する。<br> | |||
<br> | |||
以下の例では、データベースのテーブルに対して、新しい2つのレコードを追加している。<br> | |||
トランザクションがアクティブな間は、作業中のデータについては、他から一切変更が加えられないことが保証されている。<br> | |||
もし何か問題が発生すれば、catchブロック内でトランザクション開始以降の全ての変更がロールバックされる。<br> | |||
<syntaxhighlight lang="php"> | |||
<?php | |||
try | |||
{ | |||
$dbh = new PDO('odbc:SAMPLE', 'db2inst1', 'ibmdb2', array(PDO::ATTR_PERSISTENT => true)); | |||
echo "接続しました\n"; | |||
} | |||
catch (Exception $e) | |||
{ | |||
die("接続できません: " . $e->getMessage()); | |||
} | |||
try | |||
{ | |||
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); | |||
$dbh->beginTransaction(); | |||
$dbh->exec("insert into staff (id, first, last) values (23, 'Joe', 'Bloggs')"); | |||
$dbh->exec("insert into salarychange (id, amount, changedate) values (23, 50000, NOW())"); | |||
$dbh->commit(); | |||
} | |||
catch(Exception $e) | |||
{ | |||
$dbh->rollBack(); | |||
echo "失敗しました。" . $e->getMessage(); | |||
} | |||
?> | |||
</syntaxhighlight> | |||
<br> | |||
データベースの接続を閉じる場合またはPHPスクリプトが終了する場合、<br> | |||
コミットが完了していないトランザクションがあるならば、自動的にロールバックされる。<br> | |||
これは、明示的にコミットしていない場合、予期せぬ状態で終了したと推測されるため、データの不整合が発生するのを避けるための機能である。<br> | |||
<br> | |||
<u>※注意</u><br> | |||
<u>自動的にロールバックが行われる時は、<code>PDO::beginTransaction</code>メソッドを実行した場合のみである。</u><br> | |||
<u>トランザクションを開始するクエリを手動で発行した場合、PDOはそれを知ることができないため、問題が発生してもロールバックできない。</u><br> | |||
<br><br> | <br><br> | ||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:Web]] | [[カテゴリ:Web]] |