You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

try catch结构中catch是否会自动回滚MySQL事务?

关于try/catch块中事务回滚的疑问

案例1代码与现象

try {
    foo();
    bar();
} catch(SomeException $exception){
    throw new SomeException('some exception');
}

function foo()
{
    // sql query 'INSERT INTO .... execute query
}

function bar() 
{
    try{
        //some logic
    } catch(SomeException2 $exception){
        throw new SomeException2('some exception2');
    }
}

执行bar()方法时触发SomeException2异常,MySQL表中的记录被回滚,效果如同使用了事务回滚。

案例2代码与现象

try {
    db->startTransaction();
    foo();
    db->commitTransaction();
    bar();
} catch(SomeException $exception){
  
    throw new SomeException('some exception');
}

此时记录会保存到数据库中。

问题解答

案例1中的catch块并没有主动执行事务回滚操作。

出现记录回滚的效果,大概率是因为你的数据库连接处于非自动提交模式,或是foo()执行的INSERT语句还未完成提交就被异常中断:

  • 默认情况下MySQL的autocommit是开启的,每个单独SQL执行后会立即自动提交,此时foo()的INSERT应该已经持久化,不会因后续异常回滚;
  • 若你隐式开启了事务(比如之前的操作未提交),程序因异常终止后,数据库连接关闭时会自动回滚未提交的事务,才会出现“回滚”的效果。

而案例2中显式调用了事务控制方法,commitTransaction()执行后foo()的操作已持久化,所以即使bar()抛出异常,记录也不会被回滚。

内容的提问来源于stack exchange,提问作者Carrie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 03:32:34