mysql_query(“BEGIN”);
$ck_id = M(‘ods’)->add($public);
foreach ($datas as $k => $val) {
$saveData = M('odo')->add($val);
}
由于插入到odo这个表的数据我是用 foreach循环插入多条数据,怎么判断这些数据全部插入成功了呢?要是有一条没有成功,就做回滚处理。
if($ck_id && $saveData){
mysql_query("COMMIT");
$this->success("数据提交成功","__GROUP__/Warehouse/outbound");
}else{
mysql_query("ROLLBACK");
$this->error("数据回滚,请重新提交");
}
mysql_query(“END”);
如果循环了5条数据,怎么判断 $saveData 知道5条数据都插入成功了呢?需要做一个计数器吗?在循环之前 定义一个变量 $count = 0;
每插入成功一条就$count+1;
类似这样的
$count = 0;
foreach ($datas as $k => $val) {
$saveData = M('odo')->add($val);
if($saveData>0) {
$count++;
}
}
if($ck_id && $count==5) {
回滚处理…..
}
这样可以吗?谁有什么好的方法啊
通常会把事务处理写在try-catch 结构里,当add()返回错误,直接抛出异常,catch里就可以捕获到异常,然后做相应的回滚和日志记录。
还有你的开启事务不能那样写,框架底层数据库驱动不一定是用mysql扩展函数写的,而且mysql扩展函数已经不建议使用了,而用 mysqli或pdo。
thinkphp 都有相应的数据库操作方法,应该使用其封装的方法。
你的方法是可以的,也可以改成有一个不成功就rollback和跳出循环。
mysqli貌似有回滚的接口吧。
判断保存后是否有影响行数,如果没有就rollback