spring的事务管理是以AOP框架为基础的
一:基于注解的事务管理
(1)配置事务管理器及启用事务注解
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 启用事务注解 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
(2)添加事务注解
1:使用propagation指定事务的传播行为,即当前的事务方法被另一个事务方法调用,如何使用事务默认取值为Propagation.REQUIRED,即调用方法的事务,Propagation.REQUIRES_NEW使用自己的事务,调用方法的事务被挂起
2:使用isolation指定事务的隔离级别,最常用的取值为READ_COMMITTED
3:默认情况下spring的声明式事务对所有的运行时异常进行回滚,也可也以通过对应的属性进行设置,通常情况取默认值即可
4:使用readOnly指定事务是否为只读,表示这个事务只读取数据但不更新数据, 这样可以帮助数据库引擎优化事务,若真的是只读取数据库的方法,应设置readOnly=true
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Service(value="bookShopService")
public class BookShopServiceImpl implements BookShopService{
@Autowired
private BookShopDao bookShopDao;
//添加事务的注解
//1:使用propagation指定事务的传播行为,即当前的事务方法被另一个事务方法调用,如何使用事务
//默认取值为Propagation.REQUIRED,即调用方法的事务
//Propagation.REQUIRES_NEW使用自己的事务,调用方法的事务被挂起
//2:使用isolation指定事务的隔离级别,最常用的取值为READ_COMMITTED
//3:默认情况下spring的声明式事务对所有的运行时异常进行回滚,也可也以通过对应的属性进行设置,通常情况取默认值即可
//4:使用readOnly指定事务是否为只读,表示这个事务只读取数据但不更新数据, 这样可以帮助数据库引擎优化事务,若真的是
//只读取数据库的方法,应设置readOnly=true
@Transactional(propagation=Propagation.REQUIRES_NEW,
isolation=Isolation.READ_COMMITTED,
/*noRollbackFor= {UserAccountException.class}*/
readOnly=false,
timeout=3)
@Override
public void purchase(String username, String isbn) {
//1:获取书价
int price=bookShopDao.findBookPriceByIsbn(isbn);
//2:更新书的库存
bookShopDao.updataBookStock(isbn);
//3:更新用户余额
bookShopDao.updateUserAccount(username, price);
}
}
二:基于配置文件进行事务管理
(1)配置事务管理器
<!-- 1 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
(2)配置事务属性
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 根据方法名指定事务的属性 -->
<tx:method name="purchase" propagation="REQUIRES_NEW"/>
<tx:method name="get*" read-only="true"/>
<tx:method name="find*" read-only="true"/>
</tx:attributes>
</tx:advice>
(3)事务与切点关联
<aop:config>
<aop:pointcut expression="execution(* com.wh.spring.tx.xml.service.*.*(..))" id="txPointCut"/>
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut"/>
</aop:config>