我有一个控制器,我需要使令牌无效并创建一个新令牌。
控制器代码快照如下所示:
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。我试图包装更新&在事务中插入,但同样的问题。
方面
答案 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
希望这个遇到这样问题的其他人!