Yii ActiveRecord同步更新&插入失败没有错误

时间:2015-10-09 07:26:49

标签: mysql activerecord yii2-advanced-app

我有一个控制器,我需要使令牌无效并创建一个新令牌。

控制器代码快照如下所示:

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;
}

现在发生了什么 - update()也返回true&没有错误。与插入相同。单独运行,它们工作正常。但是,如果我按照它的方式打电话给它 - 它会无声地失败。

基础表是innoDB。我试图包装更新&在事务中插入,但同样的问题。

方面

1 个答案:

答案 0 :(得分:0)

我找到了原因。我在db-transaction之后在函数中调用__regenerate_token。但是在某些情况下,执行在提交/回滚更改之前退出该函数。这导致__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

希望这个遇到这样问题的其他人!