【发布时间】:2019-08-29 11:31:03
【问题描述】:
当我们可以在不使用它的情况下执行多个查询时,为什么我们需要DB::rollback()。如:
DB::beginTransaction();
//database queries here
//even if any errors pop up here, it won't reach DB::commit() and code won't get committed
DB::commit();
在上述情况下,即使任何语句失败,commit 也永远不会命中,事务也不会处理。所以回滚是不需要或强制的?
【问题讨论】:
-
所以你在这里问为什么 MySQL 需要/需要 ROLLBACK.. 理想情况下,该代码可以在 try catch 块中..
-
是的。我知道它必须在try-catch中。我只是建立一个例子。但回滚仍然是强制性的吗?
-
“但回滚仍然是强制性的吗?” 在查看 MySQL 服务器的一些源代码部分之后...... MySQL (innoDB) 对死锁和或如果可能(SQL)错误发生在执行线程上,就像我预期的那样。所以不,这不是强制性的,但做一个明确的
ROLLBACK(DB::rollback())也没有什么坏处......事实上我建议你在代码中运行DB::rollback(),这样代码就变得更清楚幕后发生了什么...... -
假设你在一个事务中有 100 个查询,它们都成功了,但是系统的不同部分产生了错误,比如邮件发送失败或支付失败,或者其他什么问题都没有做数据库。现在您要清理并恢复这 100 个查询所做的更改。无需手动清理,您只需
ROLLBACK;即可回滚数据库的状态。 -
@RaymondNijland 非常感谢您提供的信息!