spring3.0事务管理配备
spring3.0事务管理配置第一种配置方法:基于XML的事务管理这种方法不需要对原有的业务做任何修改,通过在XML
spring3.0事务管理配置
第一种配置方法:基于XML的事务管理
这种方法不需要对原有的业务做任何修改,通过在XML文件中定义需要拦截方法的匹配即可完成配置,要求是,业务处理中的方法的命名要有规律,比如setXxx,xxxUpdate等等。详细配置如下:
Xml代码??

- <!--?定义事务处理类,不同的数据访问方式,事务处理类不同??
- ????比如:Hibernate操作的HibernateTransactionManager,JDBC操作的使用DataSourceTransactionManager??
- ?-->??
- <bean?id="transactionManager"?class="org.springframework.jdbc.datasource.DataSourceTransactionManager">??
- ????<property?name="dataSource"?ref="dataSource"></property>??
- </bean>??
- ??
- <!--?定义事务通知?-->??
- <tx:advice?id="txAdvice"?transaction-manager="transactionManager">??
- ????<!--?定义方法的过滤规则?-->??
- ????<tx:attributes>??
- ????????<!--?所有方法都使用事务?-->??
- ????????<tx:method?name="*"?propagation="REQUIRED"/>??
- ????????<!--?定义所有get开头的方法都是只读的?-->??
- ????????<tx:method?name="get*"?read-only="true"/>??
- ????</tx:attributes>??
- </tx:advice>??
- ??
- <!--?定义AOP配置?-->??
- <aop:config>??
- ????<!--?定义一个切入点?-->??
- ????<aop:pointcut?expression="execution?(*?com.iflysse.school.services.impl.*.*(..))"?id="services"/>??
- ????<!--?对切入点和事务的通知,进行适配?-->??
- ????<aop:advisor?advice-ref="txAdvice"?pointcut-ref="services"/>??
- </aop:config>??
第二中配置方法:基于@Transactional的事务管理
这种方法,只需要在Spring配置文件中定义一个事务管理对象(如DataSourceTransactionManager),然后加入<tx:annotation-driven/>节点,引用该事务管理对象,然后即可在需要进行事务处理的类和方法使用@Transactional进行标注。示例如下:
Spring配置XML文件
Xml代码??

- <!--?定义事务处理类,不同的数据访问方式,事务处理类不同??
- ????比如:Hibernate操作的HibernateTransactionManager,JDBC操作的使用DataSourceTransactionManager??
- ?-->??
- <bean?id="transactionManager"?class="org.springframework.jdbc.datasource.DataSourceTransactionManager">??
- ????<property?name="dataSource"?ref="dataSource"></property>??
- </bean>??
- <!--?声明使用注解式事务?-->??
- <tx:annotation-driven?transaction-manager="transactionManager"/>??
Java代码中@Transactional示例
Java代码??

- /**?
- ?*?@author?ZYWANG?2011-3-24?
- ?*/??
- @Service??
- @Transactional(propagation?=?Propagation.REQUIRED)??
- public?class?TeacherServicesImpl?implements?TeacherServices?{??
- ????@Autowired??
- ????TeacherDao?dao?=?null;??
- ??
- ????public?TeacherDao?getDao()?{??
- ????????return?dao;??
- ????}??
- ??
- ????public?void?setDao(TeacherDao?dao)?{??
- ????????this.dao?=?dao;??
- ????}??
- ??
- ????@Override??
- ????@Transactional(readOnly=true,propagation=Propagation.NEVER)??
- ????public?List<Teacher>?getAllTeachers()?{??
- ????????return?getDao().getAllTeachers();??
- ????}??
- ??
- ????@Override??
- ????public?void?addTeacher(Teacher?teacher)?{??
- ????????if(teacher.getId()?>?0){??
- ????????????getDao().updateTeacher(teacher);??
- ????????}else{??
- ????????????getDao().addTeacher(teacher);??
- ????????}??
- ????}??
- }??
?
?个人认为第一中方式的配置的侵入性低多了,写程序时只需要关注业务和命名规范,不需要考虑事务处理;第二种方式的配置可以更加灵活的使用事务,个性化定制。
以上配置基于Spring 3.0.5 进行设置,参考其《Reference Documentation》