先说一下spring 中事物管理的机制, 它用的是aop 的思想, 也就是说把 事务管理与业务逻辑分开,
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
<property name="dataSource">
<ref local="dataSource"/>
</property>
</bean>
<bean id="userDao" class="com.Integrate.DaoImp.UserDaoImp">
<property name="dataSource">
<ref local="dataSource"/>
</property>
</bean>
<bean id="userDaoProxy"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager">
<ref local="transactionManager"/>
</property>
<property name="target">
<ref local="userDao"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED--Exception</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
这就是对UserDao 的一个事物代理, 现在对各个参数做一个说明:
target 是说明这个代理是针对那个类的代理, transactionAttributes是说明 如: key="insert*"表明以insert 开头的函数, --Exception 是指出现exception就回滚。
一种比较简单的方法是:
<bean id="baseTxProxy" lazy-init="true" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager"><ref bean="transactionManager"/></property>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean id="itemService" parent="baseTxProxy">
<property name="target">
<bean class="ItemServiceImpl" autowire="byName"/>
</property>
</bean>
这样也是可以的, lazy-init="true" 也可以写成 abstract="true"