java中设置数据库事务隔离级别主要有jdbc原生api和spring @transactional两种方式:jdbc需在setautocommit(false)后、执行sql前调用settransactionisolation();spring通过isolation属性指定,支持default、read_committed等枚举值,且仅对public方法和代理调用生效。

Java 中设置数据库事务隔离级别主要有两种常用方式:通过 JDBC 原生 API 直接操作 Connection,或借助 Spring 的 @Transactional 注解声明式配置。选择哪种方式取决于你使用的框架和事务管理模型。
使用 JDBC 设置隔离级别
在获取数据库连接后,调用 setTransactionIsolation(int level) 方法即可设置。注意必须在事务开启前(即 setAutoCommit(false) 之后、执行 SQL 之前)设置,否则行为由具体数据库驱动实现定义,可能无效或抛出异常。
-
常见常量值(来自
java.sql.Connection):Connection.TRANSACTION_READ_UNCOMMITTED(1)Connection.TRANSACTION_READ_COMMITTED(2)Connection.TRANSACTION_REPEATABLE_READ(4)Connection.TRANSACTION_SERIALIZABLE(8) - 示例代码:
Connection conn = DriverManager.getConnection(url, user, pwd);
conn.setAutoCommit(false);
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
// 执行 update/insert/delete...
conn.commit();
使用 Spring @Transactional 设置
Spring 在声明式事务中通过 isolation 属性指定隔离级别,底层仍会将该值传递给 JDBC Connection 或事务管理器(如 JTA)。该注解可作用于方法或类,支持运行时动态生效。
-
支持的枚举值(
org.springframework.transaction.annotation.Isolation):Isolation.DEFAULT:使用数据库默认级别(如 MySQL 是 REPEATABLE_READ,Oracle 是 READ_COMMITTED)Isolation.READ_COMMITTEDIsolation.REPEATABLE_READIsolation.SERIALIZABLE -
注意事项:
- 仅对 public 方法生效
- 调用需经过 Spring 代理(非 this. 直接调用)
- 若事务已存在(如外层方法已开启),新注解中的 isolation 可能被忽略(取决于传播行为)
MyBatis 中的隔离级别控制
MyBatis 本身不管理事务,但提供 TransactionIsolationLevel 枚举类(如 READ_COMMITTED),用于简化与 JDBC 隔离常量的映射。实际生效仍依赖于底层 DataSource 或 Spring 事务配置。
- 若使用 MyBatis + Spring,优先以
@Transactional(isolation = ...)为准 - 若手动管理 SqlSession,可在 openSession 时传入隔离级别:
sqlSessionFactory.openSession(TransactionIsolationLevel.READ_COMMITTED);
验证与调试建议
隔离级别是否真正生效,不能只看代码设置,还需确认:
- 数据库服务端当前默认级别(MySQL:执行
SELECT @@tx_isolation;) - 连接池是否复用连接并重置隔离级别(如 HikariCP 默认不重置,需配置
connection-init-sql=SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED) - 事务是否确实开启(检查
autoCommit是否为 false)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











