Jfinal在非controller层中的声明式事务控制

清风-蓝魔泪 发布于 2014/12/26 14:39
阅读 2K+
收藏 3

@JFinal 你好,想跟你请教个问题:

你好,波总,我又来了。。。。

我在网上搜了下,jfinal的声明式事务,大多是在controller里做的。我觉得这样设计,不太合理吧

目前我这边的架构是这样的,controller只做请求转发,外带一些简单的数据封装,和struts2的action层差不多

controller接到请求后,转发给service,这个层是专门做事务用的,每个方法都是一个事务,确保原子性

那现在问题就来了,我怎么在service中,使用声明式事务来进行事务的管理和控制。就类似spring的声明式事务一样,加一个@Transactional就行了。

麻烦多指教

加载中
0
本人纯属虚构
本人纯属虚构
事务为啥不直接看JFinal的文档 要在网上搜呢
清风-蓝魔泪
清风-蓝魔泪
文档上只写了对action的事务控制。那如果一个action中所有的操作,在我的业务中,被划分为了2个事务,怎么做。其实也就是说,不想声明式事务依赖于action。
0
JFinal
JFinal

     如果想在非 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 来做是理论化、学术化的诉求,通常软件开发是工程性的活动,理论化与学术化不经济也不实用。

JFinal
JFinal
回复 @清风-蓝魔泪 : 必然可以,你可以让需要成功的事务这样做:Db.getConfig().getThreadLocalConnection().commit(); 可以在中途就先提交一个事务,不过这种需求从来没有碰到过,将这个 action 拆分成两个更好
清风-蓝魔泪
清风-蓝魔泪
那如果,用户点击一个按钮,到了controller层。但是根据我的业务需求,这不是一个事务,而是2个事务,允许其中的一个失败,另一个成功。那如果是这样的场景,是不是就不行了?
0
无争
无争

如果一定要集成spring 的事务,请参考我这个

代码:http://git.oschina.net/319licheng/jfinal_spring_demo

http://my.oschina.net/u/811979/blog/358819

清风-蓝魔泪
清风-蓝魔泪
我不想集成spring啊,我就安安静静的在service加上一行简单的代码,实现声明式事务。随便再做一个美男子
0
无争
无争

引用来自“无争”的评论

如果一定要集成spring 的事务,请参考我这个

代码:http://git.oschina.net/319licheng/jfinal_spring_demo

http://my.oschina.net/u/811979/blog/358819

那你只能自己去实现了
返回顶部
顶部