我们都知道,mysql事务中,可能有多条sql执行,其中有一条执行失败,整个事务就会回滚。以前我自己理解的意思是,只要有一条sql的返回结果为false,那么事务就会回滚,不过现在看来是我理解错了。这里说的执行失败是指
一,sql语句发生了语法错误:比如:Db::names('t1').....
二,由于数据库设计规则导致的执行失败;如:一个表中的字段设置为了唯一,那插入重复的值时就会执行失败,导致事务回滚。
例子如下
/*
* 添加酒店和房型
* */
public function insertAll($arr_hotel=array(),$arr_room=array()){
$model = new Model();
$model->startTrans();
$flag=false;
$hid = $model->table(C('DB_PREFIX').'hotel')->add($arr_hotel);
if( $hid && count($arr_room) ==0 ){//如果没有传入房型的信息则,直接提交数据
$flag=true;
}else if( $hid && count($arr_room) >= 0){//存在对应房型信息,则添加对应的酒店编号,并处理提交
for($i=0 ; $i<count($arr_room) ; $i++){
$arr_room[$i]['hid'] = $hid;
}
$rid = $model->table(C('DB_PREFIX').'room')->addAll($arr_room);
if( $rid ){
$model->commit();
$flag=true;
}
}
if(!$flag){
$model->rollback();
}else{
$model->commit();
}
return $flag;
}