Spring中的声明式事务管理的一篇讨论

来源:互联网 发布:网络电影推广方案 ppt 编辑:程序博客网 时间:2024/05/21 14:08

在applicationContext中配置的时候,看到有这样做的:

<beans> 

... 

<bean id="myTransactionManager" class="org.springframework.orm.hibernate.HibernateTransactionManager"> 
<property name="sessionFactory"> 
<ref bean="mySessionFactory"/> 
</property> 
</bean> 

<bean id="myProductServiceTarget" class="product.ProductServiceImpl"> 
<property name="productDao"> 
<ref bean="myProductDao"/> 
</property> 
</bean> 

<bean id="myProductService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
<property name="transactionManager"> 
<ref bean="myTransactionManager"/> 
</property> 
<property name="target"> 
<ref bean="myProductServiceTarget"/> 
</property> 
<property name="transactionAttributes"> 
<props> 
<prop key="increasePrice*">PROPAGATION_REQUIRED</prop> 
<prop key="someOtherBusinessMethod">PROPAGATION_MANDATORY</prop> 
</props> 
</property> 
</bean> 

</beans> 


那么product.ProductServiceImpl的方法不需要管理事务吗?这个target bean有什么用途?是不是只有target 指定的bean按照这种方式管理事务?

最近我也在使用spring的hibernate implement,刚开始配置的时候,我只是简单的配置了applicationContext-service.xml:
代码:

<bean id="personManager" class="com.entertop.callcenter.service.implement.PersonManagerImpl" singleton="false"> 
    
<property name="personDAO"><ref local="personDAO"/></property> 
</bean> 


没有指定TransactionProxy,结果,在进行数据库操作的时候,所有的事务都没有提交。
应用框架应该是这样的:WEB-Control-Business Delegate-Persistence tier-DataBase,一般来说,在Persistence tier应该不包含Transaction代码,也就是说在持久层提供的CRUD方法中都不应该封装Transaction,这个Transaction应该在Business Delegate中封装,因为所有的事务处理都是和业务逻辑绑定的,比如:有一个增加VIP会员的业务需要增加一条记录并且更新另外一个表中的状态,你的BD层中有一个对应的addVIP()的方法,实际上addVIP分别调用了P层的两个表的DAO接口的add和update方法,通过Spring提供的TransactionProxy,在业务层基本进行事务提交,那么你就应该这么配置applicationContext-service.xml:
代码:
<bean id="personManagerTarget" class="com.entertop.callcenter.service.implement.PersonManagerImpl" singleton="false"> 
    
<property name="personDAO"><ref local="personDAO"/></property> 
</bean> 
<bean id="personManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
   
<property name="transactionManager"><ref local="transactionManager"/></property> 
   
<property name="target"><ref local="personManagerTarget"/></property> 
   
<property name="transactionAttributes"> 
      
<props> 
         
<prop key="add*">PROPAGATION_REQUIRED</prop> 
         
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop> 
      
</props> 
   
</property> 
</bean> 


看到了上面的<prop key="add*">PROPAGATION_REQUIRED</prop>这一句吗?Spring的TransactionProxyFactoryBean会在personManagerTarget方法调用add*方法之前开始一个事务,并在成功执行以后提交一个事务。当然也不用每一个BD层的类都配置这样一个事务,你可以使用BeanNameAutoProxyCreator来为每个类自动创建TransactionProxy。更详细的内容可以到网上查查资料,呵呵我也不是很熟悉,刚刚接触。。。。如果上面的理解有不对的地方,欢迎大家一起探讨。