2013-05-02 3 views
0

enter image description here У меня есть следующий фрагмент кода, и я передаю ему некоторые данные для генерации исключения и проверки, если происходит откат транзакции. Кажется, это не так, и я не знаю, почему. Может кто-нибудь мне помочь? благодаряYii транзакция не откат

  $transaction = Yii::app()->db->beginTransaction(); 

      try { 

       //..... 

       //call private methods 
       $category = MyController::saveCategory($params); 
       $test_saved = MyController::saveTest($params); 
       MyController::saveCommunity($param); // here is an exception and it should rollback the transaction but it doesn't 

       $transaction->commit(); 

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


      private function saveCommunity($param){ 

        $community = new Community(); 
        $community->user_id = $user_id; 
        $community->name = $name; 
        $community->id = 71; // this is a duplicate primary key and will generate an exception 


        try{ 
         $community->save(false, null); 
        }catch(Exception $e){ 
        throw $e; 
        } 

        return $community; 

      } 

(MySQL таблицы устанавливаются в InnoDB)

+0

я использую MySQL и я нашел mysql autocommit crea te и drop table, чтобы PDO мог откатить больше, транзакция –

ответ

0

Попробуйте изменить свой код, ответственный за исключение метания:

  try{ 
       $community->save(false, null); 
      }catch(Exception $e){ 
      throw $e; 
      } 

к чему-то вроде:

  if(!$community->save(false, null)) 
       throw new Exception('Error saving'); 

И удалить исключение метания здесь:

  } catch(Exception $e) { 
      $transaction->rollback(); 
      //throw new Exception($e); 
     } 
+0

все еще не работает. я попробовал это [один] (http://www.yiiframework.com/forum/index.php/topic/6659-cdbtransaction-is-inactive-and-cannot-perform-commit-or-roll-back-operations/) тоже и то же самое –

0

По умолчанию PDO не бросает исключения и просто игнорирует ошибки.

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
Смежные вопросы