2015-12-24 12:15:36 14535次浏览 3条回答 7 悬赏 50 金钱
$tr = Yii::app()->db->beginTransaction();
try {
    for($i=1;$i<=11;$i++){
        $test = new Test();
        $test->name = 'ab'.$i;
        if($test->save()){
     			
        }
    }
     	$tr->commit();
} catch (Exception $e) {
    $tr->rollBack();
}

上述代码就是插入11条数据,name字段是varchar长度最大为3,我想使用事务来,当$i=10或11的时候,name的值超过3了,那前面插入的几条数据就不会再表中存在。所以我用了事务,但是,结果还是前面9条还在表中,没有回滚,所以想问下,事务是不是涉及多表才能用?

  • 回答于 2015-12-24 15:02 举报

    事物需要用INNODB引擎的,看你的是不是

  • 回答于 2015-12-26 13:12 举报

    同意楼上的

  • 回答于 2015-12-26 15:52 举报

    1 首先运用事物必须是innodb引擎。其他无效,所以你先检查下数据库使用的引擎。

    2 当$i=1011的时候,$test->save() 会返回false,这仅仅是插入数据库没有成功,并不会抛出一个异常 只有产生异常的时候,才会被catch到,走catch里的代码。

    for循环完成后,因为没有产生异常,所以会走$tr->commit(); 这行代码。

    如果你想让插入失败也抛出异常的话,可以自己手动添加,这样失败的时候就会走catch里面的代码了。

    if($test->save()) {
      //插入成功
    } else {
      //插入失败
      throw new Exception('insert error'); 
    }
    
您需要登录后才可以回答。登录 | 立即注册
xyf90314
副总裁

xyf90314

注册时间:2015-03-04
最后登录:2023-03-13
在线时长:95小时23分
  • 粉丝21
  • 金钱5257
  • 威望40
  • 积分6607

热门问题