jfinal事务问题

aqu 发布于 2015/04/08 21:49
阅读 644
收藏 0

Serverless 架构就不要服务器了?>>>

场景:

1:有一个专门生成编码的静态类,,codeUtil,编码是有续的,所以会将最后生成的有续编码位数值存储在数据库表内

2:这时候,Controller 类 myController,已添加@before(Tx.class)的拦截器,它调用codeUtil生成了一个编码比如com031,可是他自己出错了,这时候事务生效,将myController类本身提交到数据库里的数据回滚了,但是codeUtil里的提交的数据却无法回滚,,于是编码就浪费了一位!

有没有办法在myController类出错的时候让codeUtil里的调用过的方法也同样回滚数据呢?

如果用原生jdbc只需传送同一个connection即可实现,不知道jfinal里该如何处理?


加载中
0
JFinal
JFinal
    通过 DbKit.getConfig().getConnection() 这个方法来得到 Connection 对象,并且 codeUtil 使用这个 connection 对象,那么 jfinal 事务就能接管 codeUtil 的事务
aqu
aqu
回复 @JFinal : 不对啊,controller里开启了事务,而codeUtil里用的也是jfinal的model操作的数据库,如果jfinal自动处理threadLocal,那controller与codeUtil用的应该是一个connection才对啊! jfinal的一个线程会生成多个connection对像?
JFinal
JFinal
回复 @aqu : 开启事务的时候 jfinal 会自动处理这个 threadlocal,所以无需对这个 threadlocal 进行操作
aqu
aqu
回复 @JinP : 好像得手动set一下ThreadLocalConnection才行
GoldenRoc
GoldenRoc
Tx拦截的controller方法中如果有子函数调用时,子函数和调用方法中涉及DB的地方不是一个connection么?连接获取是先从threadLocal获取连接,如果controller发生异常,直接throw出去就会回滚吧。
车开源
车开源
我也遇到类似的问题,学习了。
0
aqu
aqu

引用来自“JFinal”的评论

    通过 DbKit.getConfig().getConnection() 这个方法来得到 Connection 对象,并且 codeUtil 使用这个 connection 对象,那么 jfinal 事务就能接管 codeUtil 的事务

我发现DbKit里有一个ThreadLocalConnection

不知道用这个能否解决这个问题呢!

就是在controller方法第一行写:DbKit.getConfig().setThreadLocalConnection(DbKit.getConfig().getConnection);

这样的话是不是就可以在线程级实现事务管理了?

还有就是这个ThreadLocalConnection有没有开关可以默认直接打开呢?
返回顶部
顶部