浏览 5617 次
锁定老帖子 主题:关于 Spring事务处理处理的疑惑
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2004-09-03
public interface Facade{ void foo();; void bar();; } public class Impl implements Facade{ void foo();{ bar();; } void bar();{ } } <bean id="dsTransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource"><ref local="dataSource"/></property> </bean> <bean id="facade" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"><ref local="dsTransactionManager"/></property> <property name="target"><ref local="impl"/></property> <property name="transactionAttributes"> <props> <prop key="foo">PROPAGATION_REQUIRES_NEW</prop> <prop key="bar">PROPAGATION_REQUIRES_NEW</prop> </props> </property> </bean> <bean id="impl" class="Impl"> </bean> 我想知道在Impl.foo()中调用的bar()是否会启动一个新的事务呢? 我试了很多次都没有成功。还是我的理解有问题?如果需要我可以贴出完整可运行的代码。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2004-09-04
正好前一段我也对Spring的事务进行了比较细致的研究。你的疑问也是我开始时最想知道的。经过试验,我发现确实如你所言,调用同一个bean内的方法,事务声明将不起作用。我的做法是只能再增加一个bean来迂回实现这种需求,(即用你当前的bean调用新增的bean里的方法。)
|
|
返回顶楼 | |
发表时间:2004-09-04
你想想就知道,事务管理是用动态代理实现的,内部调用当然不会经过动态代理了。
|
|
返回顶楼 | |
发表时间:2004-09-04
gigix 写道 你想想就知道,事务管理是用动态代理实现的,内部调用当然不会经过动态代理了。 说的没错。但是Spring也能支持这种需求就好了。(好像EJB调用内部方法时是可以这样子的。)
|
|
返回顶楼 | |
发表时间:2004-09-05
fahrenheit 写道 正好前一段我也对Spring的事务进行了比较细致的研究。你的疑问也是我开始时最想知道的。经过试验,我发现确实如你所言,调用同一个bean内的方法,事务声明将不起作用。我的做法是只能再增加一个bean来迂回实现这种需求,(即用你当前的bean调用新增的bean里的方法。)
我好笨,怎么就没想到这个方法:( 那得要这样啦 public interface Facade1 { void bar();; } public interface Facade extends Facade1 { void foo();; } public class Impl1 implements Facade1 { public void bar(); { System.out.println("bar called");; } } public class Impl extends Impl1 implements Facade { private Facade1 facade1; public void setFacade1(Facade1 facede1); { this.facade1 = facede1; } public void foo(); { System.out.println("foo called");; this.facade1.bar();; } } <bean id="facade1" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"><ref local="dsTransactionManager"/></property> <property name="target"><ref local="impl1"/></property> <property name="transactionAttributes"> <props> <prop key="bar">PROPAGATION_REQUIRES_NEW</prop> </props> </property> </bean> <bean id="impl1" class="Impl1"> </bean> <bean id="facade" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="transactionManager"><ref local="dsTransactionManager"/></property> <property name="target"><ref local="impl"/></property> <property name="transactionAttributes"> <props> <prop key="foo">PROPAGATION_REQUIRES_NEW</prop> <prop key="bar">PROPAGATION_REQUIRES_NEW</prop> </props> </property> </bean> <bean id="impl" class="Impl"> <property name="facade1"><ref local="facade1"/></property> </bean> 这样好像蛮麻烦的,不过总算是达到了目的。 gigix 写道 你想想就知道,事务管理是用动态代理实现的,内部调用当然不会经过动态代理了。 其实我是想到了这点,但就是没想明白spring是怎么样传播事务的 |
|
返回顶楼 | |
发表时间:2004-09-05
fahrenheit 写道 gigix 写道 你想想就知道,事务管理是用动态代理实现的,内部调用当然不会经过动态代理了。 说的没错。但是Spring也能支持这种需求就好了。(好像EJB是支持调用内部方法时是可以这样子的。)这种动态代理确实有这个问题,aspectj就可以很容易达到这个目的了,要是aspectj可以动态就好了。 |
|
返回顶楼 | |