5.SpringBoot开启声明式事务
简介
springboot开启事务很简单,只需要一个注解@Transactional 就可以了。因为在springboot中已经默认对jpa、jdbc、mybatis开启了事事务,引入它们依赖的时候,事物就默认开启。当然,如果你需要用其他的orm,比如beatlsql,就需要自己配置相关的事物管理器。
构建
项目在之前整合mybatis工程的基础上
本编基于xml实现mybatis的数据访问层,并开启声明式事务。
编码
dao层
public interface UserMapper2 {
int update(@Param("name") String name,@Param("id") int id);
}
对应mapper
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xiaofine.springbootmybatis.dao.UserMapper2">
<update id="update">
UPDATE user set name=#{name} WHERE id=#{id}
</update>
</mapper>
service层
@Service
public class UserService2 {
@Autowired()
private UserMapper2 userMapper2;
@Transactional
public void transfer() throws RuntimeException{
userMapper2.update("22235111566",1);
int i=1/0;
userMapper2.update("333",2);
}
}
controller层
@RestController()
@RequestMapping("/user")
@MapperScan("com.xiaofine.springbootmybatis.dao")
public class UserController2 {
@Autowired
UserService2 userService2;
@RequestMapping("/transfer")
public void transfer(){
userService2.transfer();
}
}
测试
保存时 不修改id为1的user的内容,也不修改id为2的user。
去掉@Transactional id为1的的user.name修改了,id为2的没有修改
问题1:
当@Transactional事务不生效的时候,可以遵循以下排查步骤:
1、查看数据库或表,设置的引擎。MyISAM是不支持事务的,必须改为InnoDb。
2、@Transactional注解的方法是否为public。
如果应用在protected、private或者 package的方法上,不会报错,但是事务设置不会起作用。
3、@Transactional所注解的方法所在的类,是否已经使用了注解@Service或@Component等。
4、需要调用该方法,且需要支持事务特性的调用方,是在 @Transactional所在的类的外面。
注意:类内部的其他方法调用这个注解了@Transactional的方法,事务是不会起作用的。
5、注解为事务范围的方法中,事务的回滚仅仅对于unchecked的异常有效。对于checked异常无效。也就是说事务回滚仅仅发生在
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论。
文章标题:5.SpringBoot开启声明式事务
本文作者:xiaofine
发布时间:2020-03-21, 21:47:43
最后更新:2020-03-22, 08:24:20
原始链接:https://xiaofine1122.github.io/2020/03/21/5.SpringBoot%E5%BC%80%E5%90%AF%E5%A3%B0%E6%98%8E%E5%BC%8F%E4%BA%8B%E5%8A%A1/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。