2016-08-26 7 views
0

私はyii2基本フレームワークでトランザクションを実装しようとしています。私はトランザクションをテストするための小さなテストスクリプトを書いています。 1つの例外を除いてすべてがうまくいく。私がトランザクションスクリプトを実行していてすぐに停止すると、dbに何も変更はありません。しかし、スクリプトの実行が完了するまでスクリプトを実行しているときには、データベース内で行われた変更が望ましい方法で行われていません。たとえば、私の最初の金額が1000.00で、可変金額+100のスクリプトを実行していて、それを直ちに停止した場合、データベースは変更されませんが、スクリプトの実行が完了するまでスクリプトを実行した後、金額1000の値+ 100 + 100 = 1200、代わりに1100。ここに私のコードです。Yii2 Transaction-以前のコミットされていない値と新しいコミットされた値を更新しますか?

public function actionIndex() 
{ 

    $connection = \Yii::$app->db; 

    $transaction = $connection->beginTransaction(); 
    try 
    { 
     $command = $connection->createCommand('UPDATE test_transaction1 SET amount=amount+1 WHERE sno=1'); 

     $command->execute(); 

     $command = $connection->createCommand('UPDATE test_transaction1 SET amount=amount+1 WHERE sno=1'); 
     $command->execute(); 

     $command = $connection->createCommand('UPDATE test_transaction1 SET amount=amount+1 WHERE sno=1'); 
     $command->execute(); 

     $command = $connection->createCommand('UPDATE test_transaction1 SET amount=amount+1 WHERE sno=1'); 
     $command->execute(); 
     sleep(10); 

     $transaction->commit(); 
    } 
    catch(Exception $e) 
    { 
     $transaction->rollback(); 
    } 

私の問題は、実行していない自分のロールバックにあると思います。どのような助けも非常に高く評価されます。

+1

を、私はあなたが1ない100 –

答えて

0

私は問題がトランザクションに結びついていないと思います。トランザクションの有無にかかわらずコードを実行し、結果を比較してみてください。 はまた、私はもっと単純な構文を使用することをお勧めします:あなたのコードでは

\Yii::$app->db->transaction(function(){ 

    \Yii::$app->db 
     ->createCommand('UPDATE test_transaction1 SET amount=amount+1 WHERE sno=1') 
     ->execute(); 

    \Yii::$app->db 
     ->createCommand('UPDATE test_transaction1 SET amount=amount+1 WHERE sno=1') 
     ->execute(); 

    \Yii::$app->db 
     ->createCommand('UPDATE test_transaction1 SET amount=amount+1 WHERE sno=1') 
     ->execute(); 

    \Yii::$app->db 
     ->createCommand('UPDATE test_transaction1 SET amount=amount+1 WHERE sno=1') 
     ->execute(); 

    sleep(10); 
}); 
+0

同じ問題量を増加している参照してください。これで何も変わりません –

+0

\ Yii :: $ app-> db-> transaction(function(){..})ラッパーをコメントするとどうなりますか? (トランザクションなし) – IStranger

関連する問題