代码实例-spring声明式事务
1.spring配置文件
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util"xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/util classpath:/org/springframework/beans/factory/xml/spring-util-3.0.xsd "default-autowire="byName"><bean id="paymentSqlSqlMapClient" value="classpath:sqlmap/sqlserver/sqlserver-consume.xml" /><property name="dataSource" ref="paymentSqlDataSource" /></bean><!-- ============================ payment ======================================= --><bean id="paymentSqlDataSource" value="${sqlserver.jdbc.driver}" /><property name="url" value="${payment.sqlserver.jdbc.url}" /><property name="username" value="${payment.sqlserver.jdbc.username}" /><property name="password" value="${payment.sqlserver.jdbc.password}" /><property name="maxActive" value="30" /><property name="initialSize" value="2" /><property name="maxWait" value="60000" /><property name="maxIdle" value="30" /><property name="minIdle" value="1" /><property name="testOnBorrow" value="false"></property><property name="testWhileIdle" value="true"></property><property name="validationQuery" value="select 1 "></property><property name="timeBetweenEvictionRunsMillis"><value>300000</value></property><property name="numTestsPerEvictionRun"><value>10</value></property><property name="minEvictableIdleTimeMillis" value="300000"></property></bean> <bean id="consumeTemplate" > <property name="sqlMapClient" ref="paymentSqlSqlMapClient" /> </bean> <bean id="transactionManager" ref="paymentSqlDataSource" /></bean><tx:annotation-driven transaction-manager="transactionManager" proxy-target-/></beans>?2.代码中
package com.jd.consume.domain.consume.impl;import javax.annotation.Resource;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Propagation;import org.springframework.transaction.annotation.Transactional;import com.jd.consume.domain.consume.ConsumeChange;import com.jd.consume.domain.model.ConsumeDetail;import com.jd.consume.domain.model.OrderTask;import com.jd.consume.infrastructure.repository.ConsumeRepository;import com.jd.consume.infrastructure.repository.OrderTaskRepository;/** * 消费额度变更服务 * @author guanpanpan * */@Service(value = "consumeChange")@Transactional(value = "transactionManager", readOnly = true)public class ConsumeChangeImpl implements ConsumeChange {protected final static Logger log = LoggerFactory.getLogger(ConsumeChangeImpl.class);@Resourceprivate OrderTaskRepository orderTaskRepository;@Resourceprivate ConsumeRepository consumeRepository;public static boolean throwRuntimeExceptionInTransation = false;@Transactional(value = "transactionManager", readOnly = false, rollbackFor = Exception.class, propagation = Propagation.REQUIRED)public void addConsumeWithSingleTask(OrderTask orderTask) {ConsumeDetail consumeDetail = orderTask.genAddConsumeDetail();consumeRepository.addConsumeDetail(consumeDetail);consumeRepository.addConsumeAmount(consumeDetail);//设置状态为已处理,如果失败会在回滚中置好状态orderTaskRepository.updateCusumeStatus(orderTask.getId(), OrderTask.SYN_COMPLETE, OrderTask.SYN_LOCK);if (throwRuntimeExceptionInTransation) {throw new RuntimeException("rollBack in Test");}}@Override@Transactional(value = "transactionManager", readOnly = false, rollbackFor = Exception.class, propagation = Propagation.REQUIRED)public void reduceConsumeWithSingleTask(OrderTask orderTask) {ConsumeDetail consumeDetail = orderTask.genPastOrderTask();//设置状态为已处理,如果失败会在回滚中置好状态orderTaskRepository.updatePastCusumeStatus(orderTask.getId(), OrderTask.PAST_DUE_YET, OrderTask.PAST_LOCK);consumeRepository.addConsumeDetail(consumeDetail);consumeRepository.addConsumeAmount(consumeDetail);if (throwRuntimeExceptionInTransation) {throw new RuntimeException("rollBack in Test");}}}?