<!-- 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 事务管理并不依赖特定的事务资源
-->