关于MySQL事务,你必须知道的几个知识点!

网友投稿 501 2023-04-05

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

关于MySQL事务,你必须知道的几个知识点!

Transaction事务

上期我们讲到了jpa的常用操作,查询、更新、删除等,但是如果在操作数据库事务时发生异常 ,数据会回滚吗?下面我们来看个例子

UserController新增如下代码:

使用postman请求

localhost:8080/user/save1

执行之后可以看到java后台报错了,postman前台也报出来错误,但是数据却保存进去了,数据新增了一条记录

说明即使发生了异常,数据还是会保存进去数据库,那应该怎么办呢?试试在save1方法上加一个@Transactional的注解。

我们再执行一次。发现错误也报出来了,但是数据库并没有将新数据插入进去,最新的还是上一次的id为7的记录,那么 Transactional注解是干嘛的呢?

该注解是添加在实现类或者 接口 实现方法上,而不能放在 接口 中需要注意的是这个注解只对public方法生效

如下是该注解的属性,我们需要关注重点关注的是rollback-for和propagation两个属性。

属性名说明

name 当在配置文件中有多个 TransactionManager , 可以用该属性指定选择哪个事务管理器。 propagation 事务的传播行为,默认值为 REQUIRED。 isolation 事务的隔离度,默认值采用 DEFAULT。 timeout 事务的超时时间,默认值为-1。如果超过该时间限制但事务还没有完成,则自动回滚事务。 read-only 指定事务是否为只读事务,默认值为 false;为了忽略那些不需要事务的方法,比如读取数据,可以设置 read-only 为 true。 rollback-for 用于指定能够触发事务回滚的异常类型,如果有多个异常类型需要指定,各类型之间可以通过逗号分隔。 no-rollback- for 抛出 no-rollback-for 指定的异常类型,不回滚事务。

rollback-for:只有执行的异常才回滚。但是我们刚刚的程序并没有指定异常,那是默认的是遇到什么样的异常会回滚呢?

将UserController中的代码稍作修改,手动 throw new Exception("test") ,再执行下postman,发现事务提交了,并没有回滚。接着我们将注解修改为 @Transactional(rollbackFor = Exception.class) ,再执行postman,事务却回滚了,并没有提交,什么原因?spring的 @Transactional 注解可以很方便的开启事务,但是默认只在遇到 运行时异常 和 Error 时才会回滚,非运行时异常不回滚,即 Exception 的子类中,除了 RuntimeException 及其子类,其他的类默认不回滚。而rollbackFor属性可以解决这个问题, rollbackFor = Exception.class 表示 Exception 及其子类的异常都会触发回滚,同时不影响 Error 的回滚。

propagation:这个用得最广的需求就是业务出错了,但是日志必须提交到数据库。怎么处理?来看下面的代码。

新增LogService类

新增UserService类:

UserController新增代码

@GetMapping("save2")  public String save2() throws Exception {     //模拟业务操作     this.userService.saveBiz();     return "ok"; }

postman执行下,是不是只有log的那条记录插入进去了?biz的没有插入进去。

上一篇:从0开始:500行代码实现 LSM 数据库
下一篇:Spring Boot 集成 Flyway,数据库也能做版本控制,太牛了!
相关文章

 发表评论

暂时没有评论,来抢沙发吧~