加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

spring之事务的其它属性(隔离级别、回滚、只读、过期)(四)

发布时间:2020-12-15 01:13:00 所属栏目:大数据 来源:网络整理
导读:接上一节。 1.使用 propagation 指定事务的传播行为,即当前的事务方法被另外一个事务方法调用时如何使用事务,默认取值为 REQUIRED,即使用调用方法的事务REQUIRES_NEW: 事务自己的事务,调用的事务方法的事务被挂起。 2.使用 isolation 指定事务的隔离级别,最

接上一节。

1.使用 propagation 指定事务的传播行为,即当前的事务方法被另外一个事务方法调用时如何使用事务,默认取值为 REQUIRED,即使用调用方法的事务REQUIRES_NEW: 事务自己的事务,调用的事务方法的事务被挂起。

2.使用 isolation 指定事务的隔离级别,最常用的取值为 READ_COMMITTED。

3.默认情况下 Spring 的声明式事务对所有的运行时异常进行回滚. 也可以通过对应的属性进行设置. 通常情况下取默认值即可. 。

4.使用 readOnly 指定事务是否为只读. 表示这个事务只读取数据但不更新数据,?这样可以帮助数据库引擎优化事务. 若真的是一个只读取数据库值的方法,应设置 readOnly=true。

5.使用 timeout 指定强制回滚之前事务可以占用的时间。

    //添加事务注解
    @Transactional(propagation=Propagation.REQUIRES_NEW,isolation=Isolation.READ_COMMITTED,noRollbackFor={UserAccountException.class)
    @Override
    public void purchase(String username,String isbn) {...}

加上noRollbackFor,指定遇到UserAccountException异常后不回滚,我们对testBookShopService进行测试,即使我们加上了Transactional注解,但遇到余额不足时不进行回滚,即数据库中1001的库存还是减少了1。

    @Transactional(propagation=false,timeout=3void purchase(String username,String isbn) {
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {}
        }

由于我们是要在purchase中进行更新数据的,因此我们设置readOnly=false。设置timeout指定强制回滚的时间。我们在purchase里面加上休眠,此时休眠2s<3s。

并将数据库中数据重新设置为:

此时我们测试testBookShopService,结果为:

我们将2000改为5000,则5s>3s,再测试testBookShopService,结果为:

虽然我们的余额还可以再买一本,但是强制回滚的时间=3s<程序执行的时间,所以进行强制回滚。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读