开发者社区> 问答> 正文

Jfinal在非controller层中的声明式事务控制 400 请求报错 

@JFinal 你好,想跟你请教个问题:
你好,波总,我又来了。。。。
我在网上搜了下,jfinal的声明式事务,大多是在controller里做的。我觉得这样设计,不太合理吧
目前我这边的架构是这样的,controller只做请求转发,外带一些简单的数据封装,和struts2的action层差不多
controller接到请求后,转发给service,这个层是专门做事务用的,每个方法都是一个事务,确保原子性
那现在问题就来了,我怎么在service中,使用声明式事务来进行事务的管理和控制。就类似spring的声明式事务一样,加一个@Transactional就行了。
麻烦多指教

展开
收起
kun坤 2020-05-29 09:53:44 518 0
1 条回答
写回答
取消 提交回答
  • 事务为啥不直接看JFinal的文档 要在网上搜呢######文档上只写了对action的事务控制。那如果一个action中所有的操作,在我的业务中,被划分为了2个事务,怎么做。其实也就是说,不想声明式事务依赖于action。######      如果想在非 controller 上使用声明式事务,需要在其之上引入  AOP,通常需要引入一个 IOC,再通过 xml或者 annotation 将 AOP 与需要被代理类进行装配,这势必增大了配置量、代码量,严重拖慢开发效率。当然还可以在字节码层面动态生成 AOP 切面代码,这种方式不利于程序调试。jfinal 用 Interceptor实现的 AOP 就是为了消除大量的xml与annotation而生的,在易用性、灵活性上都有过仔细考量。建议直接使用jfinal 拦截器做事务,或者用 Db.tx(...) 来做。
        AOP 本来就是独立出来的,业务层不需要知道 AOP 在哪里,AOP紧靠service或controller在本质上并无差别,如果要找差别的话:紧靠service层做事务 AOP会让事务开启的时间稍晚一些,带来略微的性能提升,其实controller中的代码是简单的控制代码所耗性能对于业务层来说可以忽略不计,所以在 controller 上做声明式事务是jfinal权衡后最佳的选择。
         AOP 希望贴近 service 来做是理论化、学术化的诉求,通常软件开发是工程性的活动,理论化与学术化不经济也不实用。 ######回复 @清风-蓝魔泪 : 必然可以,你可以让需要成功的事务这样做:Db.getConfig().getThreadLocalConnection().commit(); 可以在中途就先提交一个事务,不过这种需求从来没有碰到过,将这个 action 拆分成两个更好######那如果,用户点击一个按钮,到了controller层。但是根据我的业务需求,这不是一个事务,而是2个事务,允许其中的一个失败,另一个成功。那如果是这样的场景,是不是就不行了?###### 如果一定要集成spring 的事务,请参考我这个
    代码:http://git.oschina.net/319licheng/jfinal_spring_demo
    http://my.oschina.net/u/811979/blog/358819 ######我不想集成spring啊,我就安安静静的在service加上一行简单的代码,实现声明式事务。随便再做一个美男子######

    引用来自“无争”的评论

    如果一定要集成spring 的事务,请参考我这个 代码:http://git.oschina.net/319licheng/jfinal_spring_demo http://my.oschina.net/u/811979/blog/358819 那你只能自己去实现了
    2020-05-29 12:01:27
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载