Spring学习(谷粒学院spring4课程)第八节 事务

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>

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值