jfian在servie上加了Tx.class。事务不起作用。

你好我jfinal在service上加了一个Tx.class。事务不起作用。数据库表示InnoDB。

评论区

JFinal

2016-11-21 19:10

业务层 AOP 需要使用 Enhancer.enhance(...) 或者 Duang.duang(...) 进行增强以后才能触发,注意看下手册

ploolp

2016-11-21 21:36

文档频道上线是多么必要啊,否则很多重复性问题

JFinal

2016-11-21 22:00

@ploolp 文档频道是极其重要的,文档频道的功能早在两个月前就做完了,只不过内容还没添加多少,还不能上线

不过这个贴子中涉及的问题在在 jfinal 手册上有详细的介绍,所以很担心即便文档频道上线,也不认真去看

芒果过敏

2016-11-24 15:15

@JFinal Enhancer.enhance(...) 也使用了。原来Enhancer的 效果只有一层,比如service调用service。

JFinal

2016-11-24 15:24

@芒果过敏 假如你有两个 Service 分别叫做 A 和 B,A 和 B 里面分别有两个业务方法 fa() 和 fb(),那么你在 fa() 上使用 Tx 拦截器,并且对 A 进行 enhance(),在如果 fa() 中调用了 f(),那么 f() 仍然处于事务之中, Tx 是一种环绕型 AOP,其下所有被调用的方法都在事务之中,不必担心

JFinal

2016-11-24 15:25

@芒果过敏 上一个回复讲了这么多,简单来说就是,虽然 enhance 的是 A,但 B的业务方法处于 fa() 事务之中,这个与 B 有没有被 enhance 没有关系,事务依然有效

芒果过敏

2016-11-24 21:14

@JFinal 我有两个业务层 A和B ,方法分别为fa何fb。我在Controller中对A进行了enhance,在fa中又调用了fb(B是用Enhancer.enhance(B)后的一个静态对象 public static B b=new B()),fb又调用了B中的一个私有方法sfb, sfb中进行了数据库操作,先插入数据,后更新另一条数据的某个字段值,更新到超长,然后异常了。 我把Tx.class放在fb上数据会回滚,放在sfb上就不会回滚。

Bay_Max

2017-08-15 14:56

@JFinal 你好 波总,我的项目采用的是dubbo,没有办法将service层的接口用enhance进行增强,这怎么使用Tx拦截器的方式啊?

JFinal

2017-08-15 16:14

@Bay_Max 使用 Db.tx(...) 做事务就可以了,看一下 jfinal 手册

Bay_Max

2017-08-15 18:18

@JFinal 就只能使用Db.tx(...)做事物,不能使用Tx拦截器,是吗

JFinal

2017-08-15 18:40

@Bay_Max 可以用 Tx 拦截器,但你要确保拦截器可以被触发,触发方式看一下 jfinal 手册,我个人喜欢用 Db.tx(...)

热门反馈

扫码入社