设置事务隔离级别没生效

arp.setTransactionLevel(Connection.TRANSACTION_REPEATABLE_READ);

设置事务隔离级别后,通过

Db.queryStr("SELECT @@tx_isolation")

查询发现输出并不是

REPEATABLE_READ

image.png

此处获取到的conn,通过断点输出

conn.getTransactionIsolation()

的值发现为mysql默认的事务级别

评论区

chcode

2019-12-25 10:25

JFinal

2019-12-25 14:04

没在 sql 之中这么玩过 tx_isolation , 建议你找找 mysql 文件,这里头可能有一个优先级的问题

chcode

2019-12-25 14:19

@JFinal 我看了源码,在获取conn连接的时候并没有设置事务级别,所以conn.getTransactionIsolation()返回的都是mysql的默认级别,除非使用Db.tx 这样是生效的,否则arp设置的其他级别都不会生效

chcode

2019-12-25 14:24

@JFinal 我在config.java 里面的getConnection() 方法 return 之前加了一行代码conn.setTransactionIsolation(this.transactionLevel);问题得到了解决,所以我觉得这块是有问题的

chcode

2019-12-25 14:24

@JFinal com.jfinal.plugin.activerecord.Config 这个类

chcode

2019-12-25 14:25

@JFinal 这块应该是一个bug

JFinal

2019-12-25 14:38

看一下源码 Tx.java, https://gitee.com/jfinal/jfinal/blob/master/src/main/java/com/jfinal/plugin/activerecord/tx/Tx.java

第 62 和 75 行,已调用 setTransactionIsolation(...);

chcode

2019-12-25 14:41

@JFinal 我是使用单独的activerecord没有Tx.java 这个类

chcode

2019-12-25 14:43

@JFinal 而且这也是使用@Before(Tx.class) 才会生效,如果没有使用拦截器 arp设置的事务级别也不会生效

JFinal

2019-12-25 14:43

@chcode 没用 Tx.java 需要用 Db.tx(...) 来应用这个参数

chcode

2019-12-25 14:44

@JFinal 我并没有要使用事务,我只是要以某个事务级别去执行sql语句

chcode

2019-12-25 14:47

@JFinal 比如我就要读取别的事务未提交的数据,就要以TRANSACTION_READ_UNCOMMITTED级别去执行sql语句

chcode

2019-12-25 14:50

@JFinal arp.setTransactionLevel(XXX);不是用来设置jdbc全局事务级别的吗?说白了我只是查询,没有任何事务的回滚也需要使用Db.tx去更改事务级别,而 arp.setTransactionLevel(XXX)更改不了

JFinal

2019-12-25 15:02

arp.setTransactionLevel(...) 只对开启事务的地方有影响,例如 Db.tx(...)、@Before(Tx.class)

其它用法没有干预用了 mysql 默认的行为

你先用 Db.tx(...) 解决一下吧,你这个需求以前没碰到过,先备忘一下,以后考虑添加支持

chcode

2019-12-25 15:10

@JFinal 好的谢谢波总的解答,不过我还是觉得开启事务和设置事务的隔离级别是两个事情,并不是在开启事务的情况下才去应用事务的隔离级别

JFinal

2019-12-25 15:32

@chcode 我感觉你说的值得深入研究,得仔细看 mysql 官方文档

chcode

2019-12-25 15:42

@JFinal 我暂时通过继承DbPro 在所有获取conn的地方设置 conn.setTransactionIsolation(config.getTransactionLevel());,虽然overwrite的方法有点多,但是是一次性的,不然就得在所有地方使用Db.tx了

JFinal

2019-12-25 15:53

@chcode 知道扩展 DbPro, 看来是高手啊, 赞

chcode

2019-12-25 16:24

@JFinal 发现了更好的解决方式 DruidDataSource dataSource = (DruidDataSource) druidPlugin.getDataSource(); dataSource.setDefaultTransactionIsolation(Connection.TRANSACTION_READ_UNCOMMITTED);不过发现了druidPlugin竟然没有实现setDefaultTransactionIsolation参数的配置,是不是该优化下了,哈哈

JFinal

2019-12-26 16:46

@chcode 已添加:
https://gitee.com/jfinal/jfinal/commit/89ef19dfa03cb018900f331fd53cc3c88263aef6

chcode

2019-12-26 18:01

JFinal

2019-12-27 11:13

@chcode DruidPlugin 可以直接复制一份出来到你自己项目中,然后改改就可以用了,不使用官方的实现,十分方便

热门反馈

扫码入社