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
相关产品推荐
相关产品推荐

