ibatis 配置事务如下(applicationContext-dao.xml):
<!-- 数据源配置 --> <bean id="dbtec2" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://${dbtec2.ip}:3306/dbtec2?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull"></property> <property name="username" value="${dbtec2.username}"></property> <property name="password" value="${dbtec2.password}"></property> <property name="maxActive" value="100"></property> <property name="maxIdle" value="30"></property> <property name="maxWait" value="500"></property> <property name="defaultAutoCommit" value="false"></property> </bean> <!-- 数据源注入session工厂 --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 映射MYBATIS的XML文件 --> <property name="mapperLocations" value="classpath*:com/octlink/tec2/bus/dao/*.xml" /> <!-- 引用数据源 --> <property name="dataSource" ref="dbtec2" /> <!-- 数据类型别名 --> <property name="typeAliasesPackage" value="com.octlink.tec2.model" /> </bean> <bean id="transactionManagerForIbatis" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dbtec2" /> </bean> <tx:advice id="txAdvice" transaction-manager="transactionManagerForIbatis"> <tx:attributes> <tx:method name="get*" read-only="true" /> <tx:method name="insert*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="update*" propagation="REQUIRED" /> <tx:method name="*" propagation="REQUIRED" /> </tx:attributes> </tx:advice> <aop:config proxy-target-class="false"> <aop:pointcut id="serviceMethod" expression="execution(* com.octlink.tec2.bus.system.*.service.*.*.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod" /> </aop:config>
Spring (spring-servlet):
<!-- 自动扫描bean,把作了注解的类转换为bean --> <context:component-scan base-package="com.octlink.tec2.bus.system.*.controller" />
注意:配置不正确导致回滚失败。如果spring-servlet文件扫描组件时,包含了service层,在事务控制的过程中引入的不是applicationContext-dao里面定义的service,这样就没事务控制了,导致事务失败。所以扫描组件时,不要包含service层。