需求的描述是有一个数组,循环处理数组数据,写入并更新数据库,写入+更新为一组数据处理,想要达到的效果是循环中如果某一组数据写入/更新失败,回滚当前组的数据库操作;
以此需求为前提写了下面这段事务处理代码,但总觉得这样写不合适
$this->db->trans_begin();
foreach ($record_data as $key => $value) {
/**
* 更新数据库操作
**/
若干代码.......
/**
* 插入数据库操作
**/
若干代码.......
if ($this->db->trans_status() === FALSE) {
$this->db->trans_rollback();
} else {
$this->db->trans_commit();
// 这里需要记录当前组操作成功的
$ok_ids[] = $value['id'];
$user_monetary[$value['user_id']] = $diff;
}
}
上面这段代码是一段典型的CI框架手动开启数据库事务的例子,有几个纠结/疑惑的点:
我把开启事务放在循环之前,把执行事务处理的部分放在代码里,可以把更新+插入当做一组数据处理,如果我循环执行到中间,有一组数据执行失败,触发了回滚,会不会把我之前的