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

JDBC中con.rollback()能否回滚已提交改动及两种异常处理的事务差异

1. con.rollback() 能否回滚已经con.commit()提交的改动?

完全不能。commit()执行成功意味着当前事务的所有改动已经被持久化到数据库,事务生命周期正式结束。rollback()的作用范围仅限当前未提交的活跃事务,对已经提交的历史改动没有任何回溯能力。

2. 两种JDBC事务写法的核心差异

首先先明确两段代码的共同逻辑:关闭自动提交后,每执行一次insert就调用一次commit(),相当于把三个insert操作拆成了三个完全独立的事务运行,前一个事务提交成功后才会进入下一个事务的执行流程。
两者的区别主要体现在异常发生后的处理逻辑:

  • 带rollback()的第一种写法:
    异常触发后会主动回滚当前未提交事务的所有改动,同时释放连接持有的所有数据库锁,保证连接内没有残留的未提交脏数据。如果你的项目用的是数据库连接池,这种写法可以保证连接归还到池时状态是干净的,不会影响后续复用连接的业务逻辑,是符合JDBC规范的标准写法。
    注意:即使加了rollback(),也只能回滚还没提交的那个事务的改动,前面已经提交成功的事务(比如异常发生在insert2阶段,insert1已经提交)的改动完全不受影响。
  • 不带rollback()的第二种写法:
    异常触发后,当前未提交的改动会一直残留在连接中,同时连接持有的数据库锁不会主动释放。如果是非池化连接(每次使用新建、用完直接关闭),连接关闭时数据库会自动回滚未提交的事务,这种场景下问题不大;但如果是池化连接,连接归还到池后未提交的事务可能被后续拿到连接的操作意外提交,产生业务脏数据,未释放的锁也容易导致其他事务阻塞、死锁等问题,存在比较大的安全隐患。

官方文档对应解读

你贴的JDBC官方说明里明确提到rollback()是撤销「当前事务」的所有改动,这里的「当前事务」指的是从最后一次commit()/rollback()执行完成后,到当前时间点开启的未结束事务,已经提交完成的事务不属于当前事务的范畴,自然不会被rollback()影响。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 05:45:05