所有的数据访问技术都有事务处理机制,这些技术提供了API用来开启事务和提交事务来完成数据操作,或者在发生错误的时候回滚数据。
Spring支持声明式事务,即使用注解来选择使需要用事务的方法,它使用@Transactional注解在方法上,表明该方法需要事务支持。这是一个机遇AOP的实现操作。被注解的方法在被调用时,Spring开启一个新的事务,当方法无异常运行结束后,Spring会提交这个事务。
springboot开启事务很简单,只需要一个注解@Transactional 就可以了。因为在springboot中已经默认对jpa、jdbc、mybatis开启了事事务,引入它们依赖的时候,事物就默认开启。当然,如果你需要用其他的orm,比如beatlsql,就需要自己配置相关的事物管理器。
下面演示springboot整合mybatis使用声明式事务。
创建项目
首先创建项目,
因为spring默认支持事务,所以不需要引入专门的事务依赖。
接下来配置数据源和mybatis:
上面都是一些简单的配置,不多说,下面开始写物业代码,首先是实体类:
然后是mapper类:
这里只定义了一个根据id修改name的方法,测试事务足够了。接下来是service方法:
这里更新了两个用户,接下来看controller类:
现在数据库中手动初始化两个数据:
然后启动项目测试接口:
根据链接可以看到更新了两个名字:
数据库中也更新成功了。
接下来让中间发生一个异常:
0作为除数会引发运行时异常,接下来启动项目执行接口:
可以看到果然引发了异常,再来看看数据库:
可以看到一个成功,一个失败,这显然是没有加事务的原因。接下来加上事务:
然后重启项目,访问接口:
可以看到依然报错,并且数据库也没发生改变。
事务不仅可以加在修改之类的方法上,还可以加在查询方法上,需要设置属性
readOnly =true
属性默认的值时false。
事务加在方法上默认对一个方法起作用,加在类上面默认对类中所有的方法起作用。比如可以在类上面加一个只读事务
这样所有的方法都是只读,但是在增删改等方法上面加上读写事务来覆盖类事务:
除了readOnly属性,还有rollbackFor属性也常用,比如下面的意思就是碰到属于Exception的异常就回滚:
springboot默认的配置已经可以满足绝大部分需求,所以需要使用事务基本上直接使用注解即可,不需要像ssm那样再配置其它的内容。
代码地址: https://gitee.com/blueses/spring-boot-demo