论坛首页 Java企业应用论坛

详解spring事务属性

浏览 132593 次
该帖已经被评为良好帖
作者 正文
   发表时间:2007-05-14  
daquan198163 写道
当然是支持的了
methodA是在内部对methodB直接调用,他们在同一个类中,调用不能被aop拦截到


这个要看你的声明方式,与是否在同一个类中没有任何关系!!!

只是看你的切点和切面在哪里!!!
0 请登录后投票
   发表时间:2007-05-14  
klyuan 写道
Qieqie 写道
klyuan 写道
jdbc的Connection只有简单的commit 和rollbacke

只有jta事务管理器才有suspend和resume!
not the case!

jdbc with "save points" supports suspend and resume


晕!!!当然你可以通过保存点来实现事务挂起和恢复!!!
前题是必须是同一个connection!!!!

当一个是数据库事务,而另外一个不是事务库事务时,怎么办?

并且,spring对require_new的处理,并没有有像NESTED那样使用JDBC 的save point!!!!


我是看错你帖子文字了 在你回帖的之前 已删除

不过你的表述太快了,有漏洞:
save point 在同一连接中, 并不能去产生新的事务 所以不支持required_new
即:“不可以保存点来实现事务挂起和恢复 哪怕是同一个connection”

你果然被我弄晕了


PS:
你感叹号太多了
0 请登录后投票
   发表时间:2007-05-14  
klyuan 写道
daquan198163 写道
当然是支持的了
methodA是在内部对methodB直接调用,他们在同一个类中,调用不能被aop拦截到


这个要看你的声明方式,与是否在同一个类中没有任何关系!!!

只是看你的切点和切面在哪里!!!

你确定么?
切点和切面在哪里也要先拦截到才能发挥作用阿
这就好比:即便你为一个bean配置了事务,但如果别人直接去调用这个类的实现而不是你配置的那个AOP代理,那么这个调用就完全不是事务的了!
0 请登录后投票
   发表时间:2007-05-14  
daquan198163 写道
klyuan 写道
daquan198163 写道
当然是支持的了
methodA是在内部对methodB直接调用,他们在同一个类中,调用不能被aop拦截到


这个要看你的声明方式,与是否在同一个类中没有任何关系!!!

只是看你的切点和切面在哪里!!!

你确定么?
切点和切面在哪里也要先拦截到才能发挥作用阿
这就好比:即便你为一个bean配置了事务,但如果别人直接去调用这个类的实现而不是你配置的那个AOP代理,那么这个调用就完全不是事务的了!


daquan198163说的是对的,同一个类里面2个方法的互相调用,第2个方法的事务声明方式不会起任何作用。
因为声明式事务都是通过事务代理类-即AOP层来实现的,类里面的直接调用是没有通过AOP代理类的,它也不能可进行拦截,所以被调用的方法的事务声明不会生效。
0 请登录后投票
   发表时间:2007-05-14  
eddie 写道
daquan198163 写道
klyuan 写道
daquan198163 写道
当然是支持的了
methodA是在内部对methodB直接调用,他们在同一个类中,调用不能被aop拦截到


这个要看你的声明方式,与是否在同一个类中没有任何关系!!!

只是看你的切点和切面在哪里!!!

你确定么?
切点和切面在哪里也要先拦截到才能发挥作用阿
这就好比:即便你为一个bean配置了事务,但如果别人直接去调用这个类的实现而不是你配置的那个AOP代理,那么这个调用就完全不是事务的了!


daquan198163说的是对的,同一个类里面2个方法的互相调用,第2个方法的事务声明方式不会起任何作用。
因为声明式事务都是通过事务代理类-即AOP层来实现的,类里面的直接调用是没有通过AOP代理类的,它也不能可进行拦截,所以被调用的方法的事务声明不会生效。


如果是单纯的方法调用,的确是不会产生拦截的!!!
不过倒底是不是这样还需要证实!!

0 请登录后投票
   发表时间:2007-05-14  
daquan198163 写道
klyuan 写道
daquan198163 写道
当然是支持的了
methodA是在内部对methodB直接调用,他们在同一个类中,调用不能被aop拦截到


这个要看你的声明方式,与是否在同一个类中没有任何关系!!!

只是看你的切点和切面在哪里!!!

你确定么?
切点和切面在哪里也要先拦截到才能发挥作用阿
这就好比:即便你为一个bean配置了事务,但如果别人直接去调用这个类的实现而不是你配置的那个AOP代理,那么这个调用就完全不是事务的了!


目前,aop的实现主要有两种方法,字节码生成和代理!
如果使用字节码生成,绝不会出现这种情况!!!
如果使用代理,则会出现这样情况!!在spring1.0中,spring aop是用代理来实现的!!!
spring 2.0可以支持原生的aspectJ。
没有研究过spring2.0的aop
0 请登录后投票
   发表时间:2007-05-14  
klyuan 写道
daquan198163 写道
klyuan 写道
daquan198163 写道
当然是支持的了
methodA是在内部对methodB直接调用,他们在同一个类中,调用不能被aop拦截到


这个要看你的声明方式,与是否在同一个类中没有任何关系!!!

只是看你的切点和切面在哪里!!!

你确定么?
切点和切面在哪里也要先拦截到才能发挥作用阿
这就好比:即便你为一个bean配置了事务,但如果别人直接去调用这个类的实现而不是你配置的那个AOP代理,那么这个调用就完全不是事务的了!


目前,aop的实现主要有两种方法,字节码生成和代理!
如果使用字节码生成,绝不会出现这种情况!!!
如果使用代理,则会出现这样情况!!在spring1.0中,spring aop是用代理来实现的!!!
spring 2.0可以支持原生的aspectJ。
没有研究过spring2.0的aop

有接口的用代理,没有接口的用字节码生成
但是结果是一样的,因为这个字节码生成是运行时产生的,并不修改目标类的字节码
因此,对目标类方法的直接调用还是可以绕过AOP的拦截
0 请登录后投票
   发表时间:2007-05-14  
   谢谢楼主的简洁的解说,对自己帮助很大,我对spring的事物没有太深的认识,所以我想问下,在一般我们在使用AOP处理事物,使用的是最简单的异常捕捉的事物回滚的拦截器,因为复杂点的事物回滚都是需要更多的信息的,就象前面要回滚到哪里,那么那些标志flag信息也会在莫个地方存取的吧? 能介绍下吗?  呵呵
0 请登录后投票
   发表时间:2007-05-14  
moshalanye 写道
   谢谢楼主的简洁的解说,对自己帮助很大,我对spring的事物没有太深的认识,所以我想问下,在一般我们在使用AOP处理事物,使用的是最简单的异常捕捉的事物回滚的拦截器,因为复杂点的事物回滚都是需要更多的信息的,就象前面要回滚到哪里,那么那些标志flag信息也会在莫个地方存取的吧? 能介绍下吗?  呵呵


声明式事务现在是以方法抛出的异常信息来决定提交或回滚的!!!

我不太明白你说什么,可否详细说明!!!
0 请登录后投票
   发表时间:2007-05-14  
"aop的实现主要有两种方法,字节码生成和代理!"

aop有三种:
1 编译时
2 loading时
3 runtime

spring aop 是runtime的(基于cglib/jdkProxy的动态字节码生成)
aspectJ支持前两种.(要进行weaver编译)

因此daquan198163所说的embeded那个问题是存在的.
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics