java中通过jdbc设置mysql事务隔离级别,关键是先调用setautocommit(false)关闭自动提交,再调用settransactionisolation()设置级别(如transaction_read_committed),且必须在执行业务sql前完成;该设置仅对当前连接本次事务生效,依赖innodb引擎支持。

Java 中通过 JDBC 设置数据库事务隔离级别,关键在于连接对象的两个操作顺序:先关闭自动提交,再设置隔离级别,且必须在执行业务 SQL 前完成。
必须先关闭自动提交(setAutoCommit(false))
MySQL 默认开启 autocommit=1,每条 SQL 立即生效,此时隔离级别设置无效。所以第一步永远是:
- connection.setAutoCommit(false); —— 显式开启事务上下文
- 这步必须在 setTransactionIsolation() 之前或之后,但一定不能晚于第一条业务 SQL 执行
- 若跳过此步,即使调用 setTransactionIsolation() 也不报错,但实际不生效
用标准常量设置隔离级别
JDBC 提供了五个静态常量,对应不同隔离语义。MySQL(InnoDB 引擎)支持前四种:
- Connection.TRANSACTION_READ_UNCOMMITTED(数值 1)→ 脏读可能发生
- Connection.TRANSACTION_READ_COMMITTED(数值 2)→ 避免脏读,常见于 Oracle/PostgreSQL
- Connection.TRANSACTION_REPEATABLE_READ(数值 4)→ MySQL 默认,避免脏读和不可重复读
- Connection.TRANSACTION_SERIALIZABLE(数值 8)→ 最高隔离,串行执行,性能开销大
注意:TRANSACTION_NONE(0)表示不支持事务,MySQL 不适用。
设置只对当前连接本次事务有效
隔离级别是会话级(session-level)配置,不是全局或连接池级:
- 每次新事务(即再次 setAutoCommit(false))都需重新设置
- 连接复用时,若未重置,可能沿用上一次的隔离级别,建议显式设置以确保预期行为
- 可执行 SELECT @@transaction_isolation; 在 MySQL 中验证当前会话实际值
确认数据库服务端是否支持
设置能否真正起作用,取决于 MySQL 版本与存储引擎:
- InnoDB 支持全部四种级别;MyISAM 不支持事务,设了也无效
- MySQL 5.7+ 默认为 REPEATABLE READ,JDBC 设置会覆盖该默认值
- 传入不被驱动识别的值(如旧版驱动不支持 SERIALIZABLE),会抛 SQLFeatureNotSupportedException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











