2012-03-01 12 views
1

私はKohanaへのトランザクションを実装しようとしていますが、Spring/Javaほど簡単ではないようです。** if(エラーなし)**とは何ですか?

これまでのところ、私はこのコードを試してみたが、私は(エラー)の部品を交換しない方法がわからない

DB::query('START TRANSACTION'); 
// sql queries with query builder.. 

if (no errors) 
    DB::query('COMMIT'); 
else 
    DB::query('ROLLBACK'); 

どのように私は、if節を作るのですか?

+0

ルックス私には擬似コードのようなものです。私はKohanaに慣れていないので、MySQLのエラーをチェックする特定の機能についてはわかりませんが、ここでは 'START TRANSACTION'クエリにMySQLエラーがあるかどうか確認する必要があります。おそらく '$ result = DB :: query( 'START TRANSACTION')のようなものです。 if($ result) ' – Travesty3

+0

最初にどのようにエラーが検出されましたか?例外は「スロー」されていますか?失敗したら偽を返しますか?それは 'trigger_error()'を投げますか? –

+0

それは私が理解しようとしていることです。 Kohanaでは、これは十分サポートされていないか、存在していないようです。 – Phil

答えて

2

通常取引は、次のような処理されます。すべてがtryブロック内で成功した場合にこれが何を意味するのか

DB::query('START TRANSACTION'); 
try { 
    //do something 
    DB::query('COMMIT'); 
} catch (Exception $e) { 
    DB::query('ROLLBACK'); 
} 

は、素晴らしいです。それに失敗した場合は、commitに到達せず、ブロックにジャンプします。ブロックにはrollbackが含まれています。あなたが望むならば、あなた自身の新しい例外を投げたり、捕まえたのと同じ例外を投げたりしても、catchの中にエラー処理を追加することができます。

+0

こんにちは、ありがとう。私はNULLをしなければならない、 'start transaction'そうでなければKohanaはエラーを返す。第2に、Kohanaはトランザクションの一部として処理する代わりに、すべてのクエリを個別に実行します。何が問題なのでしょうか? – Phil

+0

別の質問をする – nycynik

0

DBエラーは例外に変換されます:あなたがKohanaの3を使用している場合

DB::query('START TRANSACTION'); 
try { 
    // sql queries with query builder.. 

    DB::query('COMMIT'); 
} catch (Database_Exception $e) { 
    DB::query('ROLLBACK'); 
} 
+0

リンク:http://forum.kohanaframework.org/discussion/1806/handling-sql-errors-and-other-non-critical-errors/p1 – nycynik

+0

こんにちは、まず、NULLをする必要があります 'トランザクションを開始します。それ以外の場合はKohanaがエラーを返します。第2に、Kohanaはトランザクションの一部として処理する代わりに、すべてのクエリを個別に実行します。何が問題なのでしょうか? – Phil

1

ただtry/catchブロック内のすべてを包む

$db = Database::instance(); 
$db->begin(); 
try 
{ 
    // Do your queries here 
    $db->commit(); 
} 
catch (Database_Exception $e) 
{ 
    $db->rollback(); 
} 
+0

こんにちは、ありがとう。私はNULLをしなければならない、 'start transaction'そうでなければKohanaはエラーを返す。第2に、Kohanaはトランザクションの一部として処理する代わりに、すべてのクエリを個別に実行します。何が問題なのでしょうか? – Phil

+0

トランザクションはKohana側ではなく、データベース内で実行されます。 KohanaがDBサーバー上の1つのトランザクションの一部になるため、クエリを個別に実行することは完全にKayです。または、データベースが実際にトランザクションを開始しないという兆候はありますか? – Carsten

+0

テストするトランザクションの一部を失敗させる良い方法はありますか?私は2つのクエリを実行しています。そのうちの1つでは、私が間違った列名を(意図的に)供給すると、ロールバックエラーが発生しても最初の部分が実行されることがわかります。おそらく、クエリビルダーの代わりにKohanaを使用する場合、ネイティブSQLに戻ってください。 – Phil

0

DB::query('START TRANSACTION'); 
try { 
    // sql queries with query builder.. 
    DB::query('COMMIT'); 
} 
catch($e) 
{ 
    $this->template->body = new View('db_error'); 
    $this->template->body->error = 'An error occurred ...'; 
    DB::query('ROLLBACK'); 
} 
関連する問題