Spring实现基于容器的事务管理

来源:互联网 发布:阳台封窗价格计算法 编辑:程序博客网 时间:2024/06/05 04:11

<!-- Spring.xml -->
<beans>
 
    <bean id="dataSource"
    class="org.apache.commons.dbcp.BasicDataSource">
  ......
  ......
  ......
 </bean>

 <bean id="transactionManager"
    class="org.springframework.jdbc.datasource.DataSourceTransactionMaager">
  <property name="dataSource">
   <ref local="dataSource"/>
  </troperty>
 </bean>

 <bean id="userDAO" class="net.xiaxin.dao.UserDAO">
  <property name="dataSource">
   <ref local="dataSource"/>
  </property>

  <property name="target">
   <ref local="userDAO"/>
  </property>
  
  <!-- 
   可以看到,在 userDAOProxy 的 “transactionAttributes” 属性中,我们定义了针对 userDAO 的事务策略,
   即将所有名称以 insert 开始的方法(如UserDAO.insertUser方法)纳入事务管理范围.
   如果此方法抛出异常,则 Spring 将当前事务会滚,如果方法正常结束,则提交事务.
   而对所有名称以 get 开始的方法(如UserDAO.getUser方法)则以只读的事务处理机制进行处理。(
   设置只读事务,可以使持久层尝试对数据操作进行优化,如对于只读事务 Hibernate 将不执行 flush
   操作,而某些数据库连接池和 JDBC 驱动也对只读操作进行了特别优化。)
  -->
  <property name="transactionAttributes">
   <props>
    <prop key="insert*">PROPAGATION_REQUIRED</prop>
    <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>
   </props>
  </property>
 </bean>

 <!-- 配置 dataSource ,transactionManager等资源定义
   这些资源都 userDAOProxy 为的 TransactionProxyFactoryBean 服务。
   而 userDAOProxy 择对包含实际数据逻辑的 userDAO 进行了事务性封装。
 -->
 <bean id="userDAOProxy"
    class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  <property name="transactionManager">
   <ref bean="transactionManager"/>
  </property>
 </bean>
</beans>

<!-- Spring 的事务机制最为关键的两点
     1.Spring 可以将任意 Java Class 纳入事务管理
  2.Spring 事务管理并不依赖特定的事务资源
-->

原创粉丝点击