参考:https://www.cnblogs.com/kesimin/p/9546225.html
一:启动类加入@EnableTransactionManagement注解(注意springboot(=默认加了,亲测2.1.6版本不加也行)
@SpringBootApplication
@EnableTransactionManagement //开启事务
public class MkBlogApplication {
public static void main(String[] args)
{
SpringApplication.run(MkBlogApplication.class, args);
}
}
二: @Transactional注解加在需要事务的方法上,我们在保存到数据库后,抛出一个异常,结果会回滚
@Override
@Transactional
public int add(ArticleVo articleVo) {
Article article = new Article();
User user = new User();
user.setUserId(articleVo.getUserId());
article.setTitle(articleVo.getTitle());
article.setContent(articleVo.getContent());
article.setImgUrl(articleVo.getImgUrl() == ""? "imgurl":articleVo.getImgUrl());
article.setUser(user);
article.setAddUser(articleVo.getUserId());
article.setAddTime(new Date());
String cateids =articleVo.getCateIds();
if (cateids.length() >0){
String ids=cateids.substring(0,cateids.length()-1);
article.setCateIds(ids);
}
logger.info("cateids",cateids);
articleResposition.save(article);
throw new MkException("测试继承之RuntimeException的异常");
//return 1;
}
三:接下来,我们测试下事务传播特性,保存文章的方法里面我们调用user服务插入一条用户数据
@Override
@Transactional
public int add(ArticleVo articleVo) {
Article article = new Article();
User user = new User();
user.setUserId(articleVo.getUserId());
article.setTitle(articleVo.getTitle());
article.setContent(articleVo.getContent());
article.setImgUrl(articleVo.getImgUrl() == ""? "imgurl":articleVo.getImgUrl());
article.setUser(user);
article.setAddUser(articleVo.getUserId());
article.setAddTime(new Date());
String cateids =articleVo.getCateIds();
if (cateids.length() >0){
String ids=cateids.substring(0,cateids.length()-1);
article.setCateIds(ids);
}
logger.info("cateids",cateids);
articleResposition.save(article);
User user1 = new User();
user1.setEmail("sdsdsds");
user1.setMobile("13762691578");
user1.setUserName("张三");
userService.save(user1);
//throw new MkException("测试继承之RuntimeException的异常");
return 1;
}
添加用户具体代码如下
@Override
public User save(User user) {
userRepository.save(user);
throw new MkException("测试一番");
//return userRepository.save(user);
}
结果:文章表和用户表都不会插入记录
四:接下来我们换一下,保存用户加入事务,保存文章不要事务
@Override
public int add(ArticleVo articleVo) {
Article article = new Article();
User user = new User();
user.setUserId(articleVo.getUserId());
article.setTitle(articleVo.getTitle());
article.setContent(articleVo.getContent());
article.setImgUrl(articleVo.getImgUrl() == ""? "imgurl":articleVo.getImgUrl());
article.setUser(user);
article.setAddUser(articleVo.getUserId());
article.setAddTime(new Date());
String cateids =articleVo.getCateIds();
if (cateids.length() >0){
String ids=cateids.substring(0,cateids.length()-1);
article.setCateIds(ids);
}
logger.info("cateids",cateids);
articleResposition.save(article);
User user1 = new User();
user1.setEmail("sdsdsds");
user1.setMobile("13762691578");
user1.setUserName("张三");
userService.save(user1);
//throw new MkException("测试继承之RuntimeException的异常");
return 1;
}
@Override
@Transactional
public User save(User user) {
userRepository.save(user);
throw new MkException("测试一番");
//return userRepository.save(user);
}
结果是文章会插入一条记录,而user表不会
其他的就不演示了
PROPAGATION_REQUIRED | 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。 |
PROPAGATION_SUPPORTS | 支持当前事务,如果当前没有事务,就以非事务方式执行。 |
PROPAGATION_MANDATORY | 使用当前的事务,如果当前没有事务,就抛出异常。 |
PROPAGATION_REQUIRES_NEW | 新建事务,如果当前存在事务,把当前事务挂起。 |
PROPAGATION_NOT_SUPPORTED | 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。 |
PROPAGATION_NEVER | 以非事务方式执行,如果当前存在事务,则抛出异常。 |
PROPAGATION_NESTED | 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。 |