最近遇到一个问题,在一个transaction里,会遇到保存不成功,但transaction不回滚的问题。

我还以为是Yii的问题,后来才发现是自己对try catch的理解不到位。

transaction是要进行try catch的,如果try block里数据库保存失败,例如$user->save()或者$order->save()不成功,返回值false,但也仅此而已了,不抛出异常,因此transactiontry block中捕获不到Exception,自然就不回滚。

所以需要在try block里面做判断,

try{
  if ($user->save())
  {
    // do other thing, like  logging
  }
  else {
    throw new Exception('DB SAVE FAILURE');
  }
}

总之,需要判断一下,手动抛出异常。

2019年7月16日补充
核心是,try里面,必须要throw error,才能catch,比如http请求,比如数据库连接或者数据库crud等。
如果try里面永远不抛出异常,那就没什么可catch的。上面的例子里,是Yii2框架的问题,他们就是仅仅返回false,不抛出异常。

标签: try catch, Exception, transaction, rollback

添加新评论