public function roback()
{
Db::startTrans(); // 启动事务
try{
$b = Db::table('test1')->where(array("d_id"=>100))->delete();
// 提交事务
if ($b == 0) {
throw new \Exception("错误信息");
}
Db::commit(); //事务提交
dump($b);
} catch (\Exception $e) {
// 回滚事务
Db::rollback();
// 获取提示信息
dump($e->getMessage());//打印错误信息
}
}
进行事务处理的时候,MySQL 在开始事务时会切换到一个延缓操作的状态,这个状态下操作并不都是立即执行的(通常情况下语句是立即执行的)。而在 commit 时,会将延缓执行的操作都执行进去,并将状态回归到及时写入状态。同样的, rollback 时会把延缓写入的操作抛弃掉,此间申请的锁释放掉,并将状态回归到及时写入状态。
执行 rollback 的关键在于释放 申请的锁 和 回归及时写入状态,而并不是放弃未写入的操作,有时候你不执行 rollback ,影响并不会马上提现,毕竟你下一次调用 startTransaction 的时候还是会重置一下状态。但是如果你在事务之中申请了锁,或者是其他一些关联操作,那就会响应你其他与之关联操作的执行。这就好比是关闭程序,rollback 是正常的关闭流程,你不执行 rollback 就好像是强行关闭程序,难免发生奇怪的问题。