使用Db.tx方法时, 事务没有回滚

image.png

当执行到第二句 Db.update方法时, 抛出了 java.sql.SQLException的错误, 第一句sql的更新仍然执行了。  

评论区

lyh061619

2019-11-18 11:27

执行是执行了,那你检查下数据是否已经被修改

lyh061619

2019-11-18 11:28

另外看下你数据库是否是innodb引擎

星矢

2019-11-18 11:49

数据发生了修改, 我第二条是建表语句, 执行了第一条更新数据后, 第二条建表的报错后, 第一条更新数据的居然执行成功了。 数据库引擎 innodb

lyh061619

2019-11-18 12:16

@星矢 事物设计没有问题,这个没毛病,有毛病的源头要搞清楚事物的真正用法和使用场景是为了没有,其次单批调用第一条成功,下一条发生异常事物回滚跟你上条成功没有大多关连问题。再再假如你当前那条发生异常事物回滚了,数据还能修改成功也毛病不大,如果是MySQL请检查数据引擎是否是InnoDB,其他数据库。

JFinal

2019-11-19 00:53

检查一下 projectTable.update() 是不是跨数据源了

jfinal 不支持多数据源事务,跨数据源事务是分布式事务的范畴

星矢

2019-11-19 10:15

@JFinal 同一个数据源内发起的请求。 第一个用的是 model中的update, 第二个用的是Db.update 其中 Db.update执行的是 创建数据库表的操作。 当创建失败时, 系统刨出的sql异常。 然后我尝试用try cache包了一下这个Db.update,并在刨出异常时return false, 第二个刨出sql异常时第一个依然执行成功

JFinal

2019-11-19 11:51

@星矢 这个就奇怪了,去掉 try catch 试试看

星矢

2019-11-19 14:55

@JFinal 经过多次测试, 发现,当create table的时候, 抛错时事务回滚, 当 alter table的时候, 事务就不行了。 不晓得是怎么回事儿..

JFinal

2019-11-19 16:18

@星矢 这就对了, alert table、create table 这类改变数据表结构的 sql 是无法回滚的,能回滚的是改变数据本身,而不是数据结构

这个是由数据库决定的,jfinal 无法干预

星矢

2019-11-19 17:17

原来如此, 谢谢波总授道解惑

热门反馈

扫码入社