最近遇到一个问题,在一个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');
  }
}

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

标签: try catch, Exception, transaction, rollback

添加新评论