mysql事务手动控制需先关闭autocommit,再通过connection的commit()/rollback()显式管理;拦截器中应按方法名判断是否开启事务,用threadlocal绑定连接,异常时rollback、成功时commit,并在finally中清理资源。

在动态代理拦截器中控制 MySQL 事务的 commit 或 rollback,核心是把事务生命周期(开启、提交、回滚)和业务方法执行解耦,并在 invoke 方法里根据异常情况做决策。这不是 Spring 的声明式事务,而是手动管理 JDBC 连接与事务状态,需要你显式控制 Connection 的 autoCommit、commit() 和 rollback()。
拦截器中统一开启并绑定连接
代理对象每次调用业务方法前,需获取一个数据库连接,并关闭其自动提交模式:
- 从数据源(如 HikariCP)获取
Connection,调用setAutoCommit(false) - 建议将连接存入当前线程的
ThreadLocal<connection></connection>,确保同一方法链复用同一个连接 - 避免在拦截逻辑中直接 new Connection,必须走连接池,防止资源泄漏
按方法名识别是否需要事务
不是所有方法都要事务,比如查询类方法(getById、listAll)可跳过事务控制:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用
method.getName()判断,例如以"save"、"update"、"delete"开头的方法才开启事务 - 推荐用常量或枚举管理方法名,避免字符串硬编码出错
- 对 Object 自带方法(
toString、equals)直接放行,不参与事务
执行后根据异常类型决定提交或回滚
关键逻辑在 try-catch 块内:成功则 commit,捕获到异常则 rollback:
- 必须 catch SQLException 和 RuntimeException:前者覆盖数据库错误(主键冲突、连接中断),后者覆盖空指针、参数校验失败等
- 回滚前检查连接是否仍有效(
conn.isValid(1)),无效则跳过 rollback 避免二次异常 - rollback 后应主动释放连接(归还连接池),不要等到 finally 才 close —— 否则可能在 rollback 失败时漏掉清理
- 不建议只 catch Exception:太宽泛,可能吞掉本该向上抛的致命异常(如 OutOfMemoryError)
兜底保护与资源清理
即使发生未捕获异常或 JVM 中断,也要尽量保障事务终结:
- 在
finally块中恢复连接的autoCommit = true(如果支持),再 close - 若使用
ThreadLocal<connection></connection>,务必在 finally 中remove(),防止线程复用导致连接泄漏 - 注意 MySQL 的隐式提交语句(如
CREATE TABLE、ALTER TABLE)——一旦执行,前面所有操作自动提交,rollback 无效
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










