请问,mysql数据库事务回滚无效怎么回事儿?
$model = model('Model');
            $model->startTrans();
            try {
                $modelIfno = $model->find(['id'=>$id]);
                $tableName = config('database.prefix') . $modelIfno['table_name'];                /* 这两句不注销不会回滚,注销则没有问题
                $sql = "DROP TABLE {$tableName}";// 删除表
                $resSql = $model->execute($sql);
                */                $res = $model->where(['id' => $id])->delete();// 删除模型
                // 删除栏目
                $cateRes = model('cateType')->where(['mode_id' => 200])->delete();
                $model->commit();
            } catch (\Exception $e) {
                $model->rollback();
                return $this->result('', '0', '删除模型失败');
            }上面我写的代码,sql语句不注销就会直接删除传过来的表,并删除模型数据,出错不会回滚;
然后,注销掉那两句sql则会执行回滚。(栏目是故意写错的。)
不知道回滚失败的原因是什么?是删除表阻碍了?
顺便问一下mysql能否回滚删除的数据表(好像不能,不太确定,上面的代码测试猜的求告知。)?

解决方案 »

  1.   

    表都没有了,还会滚什么?
    回滚是针对记录的,并且 MySQL 也不建议你使用事务,因为他比非事务表处理慢3~5倍
      

  2.   

    为什么会有删除表的操作呢?是设计的问题还是需求的问题,不建议在代码里面删除表,实在要删除 你可以放在commit 前面就行了,删除失败你就回滚,删除成功就直接提交了