@JFinal 你好,想跟你请教个问题:
你好,波总,我又来了。。。。
我在网上搜了下,jfinal的声明式事务,大多是在controller里做的。我觉得这样设计,不太合理吧
目前我这边的架构是这样的,controller只做请求转发,外带一些简单的数据封装,和struts2的action层差不多
controller接到请求后,转发给service,这个层是专门做事务用的,每个方法都是一个事务,确保原子性
那现在问题就来了,我怎么在service中,使用声明式事务来进行事务的管理和控制。就类似spring的声明式事务一样,加一个@Transactional就行了。
麻烦多指教
事务为啥不直接看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加上一行简单的代码,实现声明式事务。随便再做一个美男子######
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。