锁定老帖子 主题:详解spring事务属性
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-05-14
daquan198163 写道 当然是支持的了
methodA是在内部对methodB直接调用,他们在同一个类中,调用不能被aop拦截到 这个要看你的声明方式,与是否在同一个类中没有任何关系!!! 只是看你的切点和切面在哪里!!! |
|
返回顶楼 | |
发表时间:2007-05-14
klyuan 写道 Qieqie 写道 klyuan 写道 jdbc的Connection只有简单的commit 和rollbacke
not the case!
只有jta事务管理器才有suspend和resume! jdbc with "save points" supports suspend and resume 晕!!!当然你可以通过保存点来实现事务挂起和恢复!!! 前题是必须是同一个connection!!!! 当一个是数据库事务,而另外一个不是事务库事务时,怎么办? 并且,spring对require_new的处理,并没有有像NESTED那样使用JDBC 的save point!!!! 我是看错你帖子文字了 在你回帖的之前 已删除 不过你的表述太快了,有漏洞: save point 在同一连接中, 并不能去产生新的事务 所以不支持required_new 即:“不可以保存点来实现事务挂起和恢复 哪怕是同一个connection” 你果然被我弄晕了 PS: 你感叹号太多了 |
|
返回顶楼 | |
发表时间:2007-05-14
klyuan 写道 daquan198163 写道 当然是支持的了
methodA是在内部对methodB直接调用,他们在同一个类中,调用不能被aop拦截到 这个要看你的声明方式,与是否在同一个类中没有任何关系!!! 只是看你的切点和切面在哪里!!! 你确定么? 切点和切面在哪里也要先拦截到才能发挥作用阿 这就好比:即便你为一个bean配置了事务,但如果别人直接去调用这个类的实现而不是你配置的那个AOP代理,那么这个调用就完全不是事务的了! |
|
返回顶楼 | |
发表时间:2007-05-14
daquan198163 写道 klyuan 写道 daquan198163 写道 当然是支持的了
methodA是在内部对methodB直接调用,他们在同一个类中,调用不能被aop拦截到 这个要看你的声明方式,与是否在同一个类中没有任何关系!!! 只是看你的切点和切面在哪里!!! 你确定么? 切点和切面在哪里也要先拦截到才能发挥作用阿 这就好比:即便你为一个bean配置了事务,但如果别人直接去调用这个类的实现而不是你配置的那个AOP代理,那么这个调用就完全不是事务的了! daquan198163说的是对的,同一个类里面2个方法的互相调用,第2个方法的事务声明方式不会起任何作用。 因为声明式事务都是通过事务代理类-即AOP层来实现的,类里面的直接调用是没有通过AOP代理类的,它也不能可进行拦截,所以被调用的方法的事务声明不会生效。 |
|
返回顶楼 | |
发表时间:2007-05-14
eddie 写道 daquan198163 写道 klyuan 写道 daquan198163 写道 当然是支持的了
methodA是在内部对methodB直接调用,他们在同一个类中,调用不能被aop拦截到 这个要看你的声明方式,与是否在同一个类中没有任何关系!!! 只是看你的切点和切面在哪里!!! 你确定么? 切点和切面在哪里也要先拦截到才能发挥作用阿 这就好比:即便你为一个bean配置了事务,但如果别人直接去调用这个类的实现而不是你配置的那个AOP代理,那么这个调用就完全不是事务的了! daquan198163说的是对的,同一个类里面2个方法的互相调用,第2个方法的事务声明方式不会起任何作用。 因为声明式事务都是通过事务代理类-即AOP层来实现的,类里面的直接调用是没有通过AOP代理类的,它也不能可进行拦截,所以被调用的方法的事务声明不会生效。 如果是单纯的方法调用,的确是不会产生拦截的!!! 不过倒底是不是这样还需要证实!! |
|
返回顶楼 | |
发表时间:2007-05-14
daquan198163 写道 klyuan 写道 daquan198163 写道 当然是支持的了
methodA是在内部对methodB直接调用,他们在同一个类中,调用不能被aop拦截到 这个要看你的声明方式,与是否在同一个类中没有任何关系!!! 只是看你的切点和切面在哪里!!! 你确定么? 切点和切面在哪里也要先拦截到才能发挥作用阿 这就好比:即便你为一个bean配置了事务,但如果别人直接去调用这个类的实现而不是你配置的那个AOP代理,那么这个调用就完全不是事务的了! 目前,aop的实现主要有两种方法,字节码生成和代理! 如果使用字节码生成,绝不会出现这种情况!!! 如果使用代理,则会出现这样情况!!在spring1.0中,spring aop是用代理来实现的!!! spring 2.0可以支持原生的aspectJ。 没有研究过spring2.0的aop |
|
返回顶楼 | |
发表时间: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的拦截 |
|
返回顶楼 | |
发表时间:2007-05-14
谢谢楼主的简洁的解说,对自己帮助很大,我对spring的事物没有太深的认识,所以我想问下,在一般我们在使用AOP处理事物,使用的是最简单的异常捕捉的事物回滚的拦截器,因为复杂点的事物回滚都是需要更多的信息的,就象前面要回滚到哪里,那么那些标志flag信息也会在莫个地方存取的吧? 能介绍下吗? 呵呵
|
|
返回顶楼 | |
发表时间:2007-05-14
moshalanye 写道 谢谢楼主的简洁的解说,对自己帮助很大,我对spring的事物没有太深的认识,所以我想问下,在一般我们在使用AOP处理事物,使用的是最简单的异常捕捉的事物回滚的拦截器,因为复杂点的事物回滚都是需要更多的信息的,就象前面要回滚到哪里,那么那些标志flag信息也会在莫个地方存取的吧? 能介绍下吗? 呵呵
声明式事务现在是以方法抛出的异常信息来决定提交或回滚的!!! 我不太明白你说什么,可否详细说明!!! |
|
返回顶楼 | |
发表时间:2007-05-14
"aop的实现主要有两种方法,字节码生成和代理!"
aop有三种: 1 编译时 2 loading时 3 runtime spring aop 是runtime的(基于cglib/jdkProxy的动态字节码生成) aspectJ支持前两种.(要进行weaver编译) 因此daquan198163所说的embeded那个问题是存在的. |
|
返回顶楼 | |