java中通过jdbc设置mysql事务隔离级别,核心是在获取connection后、开启事务前调用settransactionisolation()方法,并确保已关闭自动提交(setautocommit(false));该设置仅对当前连接本次事务生效,且mysql需使用innodb引擎才真正支持。

Java 中通过 JDBC 设置 MySQL 的事务隔离级别,核心是在获取 Connection 后、开启事务前调用 setTransactionIsolation() 方法,并确保连接处于手动提交模式(setAutoCommit(false))。这个设置只对当前连接生效,且必须在事务开始前完成。
设置前必须关闭自动提交
MySQL 默认是自动提交(autocommit=1),每条 SQL 执行完立即生效,无法体现隔离级别效果。所以第一步永远是:
-
connection.setAutoCommit(false);—— 显式开启事务上下文 - 这一步必须在
setTransactionIsolation()之前或之后(但必须在执行业务 SQL 前) - 若未关闭自动提交,隔离级别设置虽不报错,但实际不会起作用
使用标准常量设置隔离级别
JDBC 定义了五个静态常量,对应不同隔离级别。MySQL 8.0+ 支持全部四种常用级别,常用写法如下:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
Connection.TRANSACTION_READ_UNCOMMITTED→ 读未提交(数值 1) -
Connection.TRANSACTION_READ_COMMITTED→ 读已提交(数值 2) -
Connection.TRANSACTION_REPEATABLE_READ→ 可重复读(数值 4,MySQL 默认) -
Connection.TRANSACTION_SERIALIZABLE→ 串行化(数值 8) -
Connection.TRANSACTION_NONE(数值 0)表示不支持事务,MySQL 不适用
示例代码片段:
Connection conn = DriverManager.getConnection(url, user, pwd); conn.setAutoCommit(false); // 必须先关自动提交 conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED); // 然后执行 update/select 等操作... conn.commit(); // 或 rollback()
注意数据库服务端是否支持该级别
MySQL 实际支持的级别取决于版本和存储引擎:
- InnoDB 支持全部四种;MyISAM 不支持事务,设了也无效
- MySQL 5.7+ 默认隔离级别是
REPEATABLE READ,JDBC 设置会覆盖会话级默认值 - 若传入不被支持的值(如某些旧驱动不识别
SERIALIZABLE),会抛SQLFeatureNotSupportedException - 可通过
SELECT @@transaction_isolation;在 MySQL 中验证当前会话实际生效的级别
事务边界内设置才有效
隔离级别是**会话级(session-level)设置**,只影响当前 Connection 在本次事务中的行为:
- 不能跨事务生效:每次新事务(即新一次
setAutoCommit(false)开始)都需重新设置(除非连接复用且未重置) - 不能跨连接生效:另一个 Connection 即使同用户、同库,也不继承该设置
- 若使用连接池(如 HikariCP),务必注意:连接归还池前应重置为默认隔离级别,避免污染后续使用者
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










