029-声明式事务

所有的数据访问技术都有事务处理机制,这些技术提供了API用来开启事务和提交事务来完成数据操作,或者在发生错误的时候回滚数据。

Spring支持声明式事务,即使用注解来选择使需要用事务的方法,它使用@Transactional注解在方法上,表明该方法需要事务支持。这是一个机遇AOP的实现操作。被注解的方法在被调用时,Spring开启一个新的事务,当方法无异常运行结束后,Spring会提交这个事务。

springboot开启事务很简单,只需要一个注解@Transactional 就可以了。因为在springboot中已经默认对jpa、jdbc、mybatis开启了事事务,引入它们依赖的时候,事物就默认开启。当然,如果你需要用其他的orm,比如beatlsql,就需要自己配置相关的事物管理器。


下面演示springboot整合mybatis使用声明式事务。

创建项目

首先创建项目,

029-声明式事务_第1张图片

因为spring默认支持事务,所以不需要引入专门的事务依赖。

接下来配置数据源和mybatis:

029-声明式事务_第2张图片
029-声明式事务_第3张图片

上面都是一些简单的配置,不多说,下面开始写物业代码,首先是实体类:

029-声明式事务_第4张图片


然后是mapper类:

029-声明式事务_第5张图片

这里只定义了一个根据id修改name的方法,测试事务足够了。接下来是service方法:

029-声明式事务_第6张图片

这里更新了两个用户,接下来看controller类:

029-声明式事务_第7张图片

现在数据库中手动初始化两个数据:

029-声明式事务_第8张图片

然后启动项目测试接口:

029-声明式事务_第9张图片

根据链接可以看到更新了两个名字:

029-声明式事务_第10张图片

数据库中也更新成功了。

接下来让中间发生一个异常:

029-声明式事务_第11张图片

0作为除数会引发运行时异常,接下来启动项目执行接口:

029-声明式事务_第12张图片

可以看到果然引发了异常,再来看看数据库:

029-声明式事务_第13张图片

可以看到一个成功,一个失败,这显然是没有加事务的原因。接下来加上事务:

029-声明式事务_第14张图片

然后重启项目,访问接口:

029-声明式事务_第15张图片
029-声明式事务_第16张图片

可以看到依然报错,并且数据库也没发生改变。


事务不仅可以加在修改之类的方法上,还可以加在查询方法上,需要设置属性

readOnly =true

属性默认的值时false。


事务加在方法上默认对一个方法起作用,加在类上面默认对类中所有的方法起作用。比如可以在类上面加一个只读事务

029-声明式事务_第17张图片

这样所有的方法都是只读,但是在增删改等方法上面加上读写事务来覆盖类事务:

除了readOnly属性,还有rollbackFor属性也常用,比如下面的意思就是碰到属于Exception的异常就回滚:


springboot默认的配置已经可以满足绝大部分需求,所以需要使用事务基本上直接使用注解即可,不需要像ssm那样再配置其它的内容。


代码地址: https://gitee.com/blueses/spring-boot-demo

你可能感兴趣的:(029-声明式事务)