2011-07-23 10 views
3

私は本当に行のIDに応じて、列を更新、私は次のスクリプトが起こっているDBAL教義DBAL取引

で取引を行う方法を理解していません。私はテーブルに存在しない偽のIDを入れます(したがって、更新を行うことはできません)が、最初の更新はトランザクションであるにもかかわらずコミットされます。そのうちの1つが失敗した場合、すべてのトランザクションが失敗すると思います。

$conn -> beginTransaction(); 
    try{ 
     $try = $conn->prepare("update table set column = '123' where id = 0"); //column exists 
     $try->execute(); 
     $try = $conn->prepare("update table set column = '123' where id = 1"); //column exists 
     $try->execute(); 
     $try = $conn->prepare("update table set column = '123' where id = 120"); //column does not exists 
     $try->execute(); 

     $try = $conn->commit(); 
    } 
    catch(Exception $e) { 
     $try = $conn->rollback(); 
     throw $e; 
    } 

期待される結果、ID = 120を持つ行が 実結果が存在しないので、無更新は、すべての行は、非existant行を除いて更新されます。

私は前もってお詫びしますが、オブジェクト指向プログラミングはまだ私にとっては南極です。

答えて

3

この動作はエラーではないため、誰かが同様の問題を遭遇した場合は、未来のに少しでも説明します。更新条件が存在しない列を参照するので、クエリは失敗しません

$try = $conn->prepare("update table set column = '123' where id = 120"); //column does not exists 
$try->execute(); 

ここでは、0(ゼロ)の行を更新します。 Doctrineでは、影響を受けた行の数が​​メソッドによって返されます。

例外をスローしてロールバックを開始することができます。

$try = $conn->prepare("update table set column = '123' where id = 120"); //column does not exists 
$affected = $try->execute(); 
if ($affected == 0) { 
    throw new Exception('Update failed'); 
} 
1

このコードは、例外がスローされた場合にのみトランザクションをロールバックします。

更新に失敗した場合は、例外ではなくfalseを返します。

あなたは例外なしに試みることがあります。

$try = $conn->commit(); 
if (!$try) { 
    $conn->rollback(); 
} 

または結果がfalseときに例外をスローします。

+2

$ try = $ conn-> commit(); $をブールにしようとしない...本当に何も起こりそうにない? – Mallow