spring事务之REQUIRED

准备

1.表

CREATE TABLE `t_user` (`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',`username` varchar(64) NOT NULL COMMENT '用户名',`password` varchar(64) DEFAULT NULL COMMENT '密码',`mobile` varchar(64) NOT NULL COMMENT '手机号码',`name` varchar(64) DEFAULT NULL COMMENT '真实姓名',`is_delete` tinyint(1) DEFAULT NULL COMMENT 'is_delete',`gmt_modified` datetime DEFAULT NULL COMMENT 'gmt_modified',`gmt_create` datetime DEFAULT NULL COMMENT 'gmt_create',PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4;CREATE TABLE `t_game` (`id` int(11) NOT NULL AUTO_INCREMENT,`user_id` bigint(20) NOT NULL,`created` date DEFAULT NULL,`name` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4;

2.实体类

@Data
public class UserDo {private Long id;private String username;private String password;private String mobile;private String name;private Boolean isDelete;private Date gmtModified;private Date gmtCreate;
}@Data
public class GameDo {private Integer id;private Long userId;private Date created;private String name;
}

单表

这些方法都在UserManager.java中:

1.粟子一

@Transactional(propagation = Propagation.REQUIRED)
public void methodB() {UserDo userDo = new UserDo();userDo.setName("user");userDo.setUsername("user-aa");userDo.setMobile("17370998767");userDao.insert(userDo);if (1 == 1) {throw new RuntimeException("异常");}
}# junit@Test
public void userMethodBTest(){userManager.methodB();
}

测试结果:事务回滚,表中未插入数据

2.粟子二

@Transactional(propagation = Propagation.REQUIRED)
public void methodD(){try {UserDo userDo = new UserDo();userDo.setName("user");userDo.setUsername("user-aa");userDo.setMobile("17370998767");userDao.insert(userDo);if (1 == 1) {throw new RuntimeException("异常");}} catch (RuntimeException e) {e.printStackTrace();throw e;}
}@Test
public void userMethodDTest(){userManager.methodD();
}

测试结果:事务回滚,表中未插入数据,相当于粟子1

3.粟子三

@Transactional(propagation = Propagation.REQUIRED)
public void methodC(){try {UserDo userDo = new UserDo();userDo.setName("user");userDo.setUsername("user-aa");userDo.setMobile("17370998767");userDao.insert(userDo);if (1 == 1) {throw new RuntimeException("异常");}} catch (RuntimeException e) {e.printStackTrace();}
}# junit
@Test
public void userMethodCTest(){userManager.methodC();
}

测试结果:异常被处理,事务不回滚,表中插入数据

多表

GameManager.java中:

@Transactional(propagation = Propagation.REQUIRED)
public void meanB(){GameDo gameDo = new GameDo();gameDo.setName("测试");gameDo.setUserId(1L);gameDao.insert(gameDo);if (1==1){throw new RuntimeException("异常");}
}

下面都是在UserManager.java中,调用meanB方法:

1.粟子一:

@Transactional(propagation = Propagation.REQUIRED)
public void methodE() {UserDo userDo = new UserDo();userDo.setName("user");userDo.setUsername("user-aa");userDo.setMobile("17370998767");userDao.insert(userDo);gameManager.meanB();
}# junit
@Test
public void userMethodETest(){userManager.methodE();
}

测试结果:事务回滚,表中未插入数据

2.粟子二

@Transactional(propagation = Propagation.REQUIRED)
public void methodG() {UserDo userDo = new UserDo();userDo.setName("user");userDo.setUsername("user-aa");userDo.setMobile("17370998767");userDao.insert(userDo);try {gameManager.meanB();} catch (RuntimeException e) {e.printStackTrace();throw e;}
}# junit@Test
public void userMethodGTest(){userManager.methodG();
}

测试结果:事务回滚,表中未插入数据

3.粟子三:

@Transactional(propagation = Propagation.REQUIRED)
public void methodF() {UserDo userDo = new UserDo();userDo.setName("user");userDo.setUsername("user-aa");userDo.setMobile("17370998767");userDao.insert(userDo);try {gameManager.meanB();} catch (Exception e) {e.printStackTrace();}
}# junit
@Test
public void userMethodFTest(){userManager.methodF();
}

测试结果:事务回滚,表中未插入数据

这很奇怪呀,已经try catch了,讲道理是user表会插入数据,而game表中数据回滚,为什么呢?这就是spring事务传播级别Propagation.REQUIRED了,使用了Propagation.REQUIRED,如果本来有事务,则加入该事务,如果没有事务,则创建新的事务,本质上使用的是同一个连接connection。看异常有:

org.springframework.transaction.UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-onlyat org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:724)at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:485)at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:291)at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655)

这个异常的意思是,由于内层抛出异常,已经将Transaction的状态标记为rollback-only,所以外层事务也只好回滚,但这个特性是基于同一个事务的,如果是嵌套事务就不一定了

spring事务之REQUIRED相关推荐

  1. spring 事务传播REQUIRED 与 NESTED的区别

    总结 NESTED 似乎与REQUIRED 是一样的,但是他们是不同的. 若a 调用b 方法.a方法为REQUIRED,且在a中捕获b方法异常.注意 a ,b 方法不要在一个service中,不然事务 ...

  2. spring的事务隔离_再深一点:面试工作两不误,源码级理解Spring事务

    原创:小姐姐味道(微信公众号ID:xjjdog),欢迎分享,转载请保留出处. Spring有5种隔离级别,7种传播行为.这是面试常问的内容,也是代码中经常碰到的知识点.这些知识枯燥而且乏味,其中有些非 ...

  3. spring上下文是什么意思_Java程序员只会CRUD连Spring事务传播机制都不懂?

    AQS到底有什么用?难道就真的只是为了面试吗? 当然不是说AQS没用,如果你不是做基础架构或者中间件开发,你很难感受到AQS的威力.当然,学习很多时候,需要的是正向反馈,学了太多造火箭的东西,面试完就 ...

  4. Spring事务管理 与 SpringAOP

    1,Spring事务的核心接口 Spring事务管理的实现有许多细节,如果对整个接口框架有个大体了解会非常有利于我们理解事务,下面通过讲解Spring的事务接口来了解Spring实现事务的具体策略.  ...

  5. 原创 | CRUD更要知道的Spring事务传播机制

    来自:肥朝 AQS到底有什么用?难道就真的只是为了面试吗? 当然不是说AQS没用,如果你不是做基础架构或者中间件开发,你很难感受到AQS的威力.当然,学习很多时候,需要的是正向反馈,学了太多造火箭的东 ...

  6. 聊聊Spring事务失效的12种场景,太坑人了

    前言 对于从事java开发工作的同学来说,spring的事务肯定再熟悉不过了. 在某些业务场景下,如果一个请求中,需要同时写入多张表的数据.为了保证操作的原子性(要么同时成功,要么同时失败),避免数据 ...

  7. Spring 事务之@Transactional

    在业务代码中,有如下两种情况,比如: throw new RuntimeException("xxxxxxxxxxxx"); 事务回滚 throw new Exception(&q ...

  8. SPRING 事务管理说明

    spring 事务管理是通过AOP拦截指定的方法,进行事务管理. 事务配置 <aop:config proxy-target-class="true"><aop: ...

  9. SSH深度历险(六) 深入浅出----- Spring事务配置的五种方式

    这对时间在学习SSH中Spring架构,Spring的事务配置做了具体总结.在此之间对Spring的事务配置仅仅是停留在听说的阶段,总结一下.总体把控.通过这次的学习发觉Spring的事务配置仅仅要把 ...

  10. Spring事务传播性与隔离级别

    为什么80%的码农都做不了架构师?>>>    事务是逻辑处理原子性的保证手段,通过使用事务控制,可以极大的避免出现逻辑处理失败导致的脏数据等问题. 事务最重要的两个特性,是事务的传 ...

最新文章

  1. “智源论坛Live”报名 | 清华大学岂凡超:义原知识库的应用和扩充
  2. 【ijkplayer】编译 Android 版本的 ijkplayer ① ( Ubuntu 安装 Git 软件 | 下载 ijkplayer 代码 )
  3. mysql索引分析和优化_MySQL索引分析和优化
  4. CF Edu54 E. Vasya and a Tree DFS+树状数组
  5. 受困于敏捷开发的数据与架构?肿么办?
  6. Nodejs服务器端处理POST提交的数据_note
  7. go按行读取数据的坑
  8. eclipse Unable to build: the file dx.jar was not loaded from the SDK folder的解决办法
  9. mysql自动跑sql发邮件_SQL server 表数据改变触发发送邮件的方法
  10. linux 更换 镜像源
  11. 处理 TXT 文本技巧
  12. Ubuntu下安装使用Monaco字体
  13. 解决:如何利用ssh命令,免密登录远程服务器
  14. 第四届IT 2020高端论坛成功举办
  15. Java异常 #Class path contains multiple SLF4J bindings.警告解决
  16. 不是maf格式的somatic突变数据就没办法读入到maftools了么
  17. 【每日一句】名人名言学英语(11.26)
  18. 【云原生 | 03】裸金属架构之服务器安装VMWare ESXI虚拟化平台详细流程
  19. Java提供的网络支持
  20. 达人评测R5 7530U和r5 5600u选哪个好

热门文章

  1. 南京市公安局电子警察系统数据库扩容和异地灾备公开招标采购公告
  2. 【RDMA】RDMA通信测试工具|RDMA信息查询工具
  3. 混沌加密的理解及应用,附代码
  4. 《东周列国志》第八十四回 智伯决水灌晋阳 豫让击衣报襄子
  5. 学美容化妆培训学校到哪里最好
  6. 【ICPC-303】hau 1874 畅通工程续
  7. Ubuntu下rar带密码压缩/解压命令
  8. spring boot火车票预订系统毕业设计-附源码091029
  9. Jmail的使用方法
  10. 2020年十七届华为杯数学建模比赛记录