2015-10-09 5 views
0

У меня есть контроллер, где мне нужно сделать недействительным токен и создать новый токен.Yii ActiveRecord Одновременное обновление и вставка не работает без ошибок

Контроллер код снимок выглядит примерно так:

function __regenerate_token($t) 
{ 
    if($token = Token::find()->where('token = :t' , ['t'=>$t])->one()) 
    { 
     $token->expired = true; 
     $token->save(); // ->save(false); 
    } 

    $newtoken = new Token(); 
    $newtoken->attributes = [ 
      'token'=> strtolower(trim(\com_create_guid(), '{}')), 
      'expiry_at' => strtotime("+10 minutes"), 
    ]; 
    $newtoken->save(false); 

    return $newtoken; 
} 

Теперь Что происходит это - обновление() также не возвращает истинных & без ошибок. То же самое со вставкой. В индивидуальном порядке они работают нормально. Но если я назову их им так, как есть, это терпит неудачу.

Основополагающий стол - innoDB. Я попытался обернуть обновление & вставить внутри транзакции, но такую ​​же проблему.

С уважением

ответ

0

Я узнал причину. Я вызывал __regenerate_token в функции после db-транзакции. Однако в определенных условиях выполнение завершило выполнение функции перед выполнением/откатом изменений. Это вызвало то, что __regenerate_token также стал частью транзакции и не удалось.

псевдокода

function debit_account 
    begin transaction 
    try 
     do stuff 
     if some_condition 
      return false #<-- this caused issue 
     endif 
     commit 

     return true 
    catch 
     rollback 

    return false 
end function 

debit_account() 
__regenerate_token() #fails when some_condition is hit 

Надеется, что это кто-то, кто попадет в проблему, как это!

Смежные вопросы