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>
...
<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>
<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>
<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。更详细的内容可以到网上查查资料,呵呵我也不是很熟悉,刚刚接触。。。。如果上面的理解有不对的地方,欢迎大家一起探讨。
- Spring中的声明式事务管理的一篇讨论
- Spring的声明式事务管理
- Spring 的声明式事务管理
- spring的声明式事务管理
- Spring的声明式事务管理
- Spring的声明式事务管理
- Spring--声明式事务管理
- 声明式事务管理--Spring
- Spring声明式事务管理
- Spring声明式事务管理
- Spring声明式事务管理
- Spring声明式事务管理
- Spring声明式事务管理
- spring声明式事务管理
- Spring声明式事务管理
- spring声明式事务管理
- spring声明式事务管理
- Spring 声明式事务管理
- Tomcat6.0增加虚拟目录
- 选杀软像是挑媳妇--小忆杀毒软件
- 抗击疲劳的22条策略
- Spy++原理初探(VB篇)
- 关于矩阵变换器的一些思考点
- Spring中的声明式事务管理的一篇讨论
- 加载真彩色工具栏
- 使用asp.net mvc再造一个digg 第一部分
- 【原创翻译】如何在本地主机上使用tbdev建立一台bt Tracker服务器【网站建设文档】
- 与动态执行的C# 代码进行通讯
- 一小时asp
- Discuz中设置广告的一个需要注意的地方
- 洗衣机还被人占着~
- 用HijackThis或卡卡安全助手轻松去除Win XP任务栏里的蓝色五角星