Spring 声明式事务管理

Spring声明式事务管理

为何要使用声明式事务管理功能呢?

案例:购物

在dao层定义了两个方法:1. 商品库存减1。2.用户账户减去商品价格

service层定义购物方法,调用dao层的两个方法。先执行2,在执行1.

如果方法1中出现了错误,这时候就会出现,用户账户已经扣除了金额但是商品库存却不变的情况。

因此我们就需呀使用声明式事务管理功能,将该方法定义为一个整体事务。

1. 使用步骤
  1. 在IOC容器中声明事务管理器,并开启基于注解的声明式事务管理功能。
		<!-- 声明事物管理器 -->
    <bean id="manager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>
    <!-- 开启基于注解的声明式事物管理功能 -->
    <tx:annotation-driven transaction-manager="manager"/>
  1. 在需要使用声明式事务管理功能的地方添加注解 @Transactional,默认的事务传播机制为REQUIRED,即有一个错误整体回滚
  2. 如果一个事物中有多个独立的事务,我们不希望其中一个事物有异常导致全部回滚,这时候我们可以改变声明式事务的传播机制,@Transactional(propagation = Propagation.REQUIRES_NEW),这样每个事务都是独立的
  3. 在阿里巴巴的规范手册中规定:需要在Transactional注解指定rollbackFor或者在方法中显式的rollback。 我们只需添加上 rollbackFor = Exception.class或者rollbackFor = RuntimeException.class即可。意为:当出现异常或运行时异常时进行回滚操作。
2. 声明式事务的隔离级别

mysql的四种隔离级别:读未提交READ_UMCOMMITTED,读已提交READ_COMMITTED,可重复读REPEATABLE_READ,可串行化SERIALIZABLE

默认的隔离级别为:可重复读REPEATABLE_READ

可以通过@Transactional(isolation = Isolation.READ_COMMITTED)进行修改

3. 事务的超时回滚

@Transactional(timeout = 2) 设置如果超过2秒没有完成,则进行回滚

4. 事务的只读模式

如果事务中全都为读操作,可以设置为只读模式@Transactional(readOnly = true),方便数据库的底层优化。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值