论坛首页 Java企业应用论坛

关于 Spring事务处理处理的疑惑

浏览 5617 次
精华帖 (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()是否会启动一个新的事务呢?
我试了很多次都没有成功。还是我的理解有问题?如果需要我可以贴出完整可运行的代码。
   发表时间:2004-09-04  
正好前一段我也对Spring的事务进行了比较细致的研究。你的疑问也是我开始时最想知道的。经过试验,我发现确实如你所言,调用同一个bean内的方法,事务声明将不起作用。我的做法是只能再增加一个bean来迂回实现这种需求,(即用你当前的bean调用新增的bean里的方法。)
0 请登录后投票
   发表时间:2004-09-04  
你想想就知道,事务管理是用动态代理实现的,内部调用当然不会经过动态代理了。
0 请登录后投票
   发表时间:2004-09-04  
gigix 写道
你想想就知道,事务管理是用动态代理实现的,内部调用当然不会经过动态代理了。
说的没错。但是Spring也能支持这种需求就好了。(好像EJB调用内部方法时是可以这样子的。)
0 请登录后投票
   发表时间: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是怎么样传播事务的
0 请登录后投票
   发表时间:2004-09-05  
fahrenheit 写道
gigix 写道
你想想就知道,事务管理是用动态代理实现的,内部调用当然不会经过动态代理了。
说的没错。但是Spring也能支持这种需求就好了。(好像EJB是支持调用内部方法时是可以这样子的。)

这种动态代理确实有这个问题,aspectj就可以很容易达到这个目的了,要是aspectj可以动态就好了。
0 请登录后投票
论坛首页 Java企业应用版

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