一个注解@Transactional(rollbackFor = Exception.class),今天就和大家分享一下,这个注解的用法; ?...声明式事务管理也有两种常用的方式,一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解。显然基于注解的方式更简单易用,更清爽。...在项目中,@Transactional(rollbackFor=Exception.class),如果类加了这个注解,那么这个类里面的方法抛出异常,就会回滚,数据库里面的数据也会回滚。...在@Transactional注解中如果不配置rollbackFor属性,那么事物只会在遇到RuntimeException的时候才会回滚,加上rollbackFor=Exception.class,可以让事物在遇到非运行时异常时也回滚...@Transactional注解的全部属性详解 @Transactional属性 属性 类型 描述 value String 可选的限定描述符,指定使用的事务管理器 propagation enum:
上周,一同事看到我去年写的一些代码,@Transactional 加上了 rollbackFor,就问我为什么。我当时和他解释了一番,这里我分享出来,希望能够帮助到更多的人。...彻底弄懂@Transactional和@Transactional(rollbackFor = Exception.class)的区别到底在哪里!...如果需要支持回滚Exception异常请用@Transactional(rollbackFor = Exception.class)。...这里如果是增删改的时候我建议大家都使用@Transactional(rollbackFor = Exception.class)。...补充一下@Transactional(rollbackFor = Exception.class)一些失效的场景。
1 让checked例外也回滚:在整个方法前加上 @Transactional(rollbackFor=Exception.class) 2 让unchecked例外不回滚: @Transactional...(notRollbackFor=RunTimeException.class) 3 不需要事务管理的(只查询的)方法:@Transactional(propagation=Propagation.NOT_SUPPORTED...注意: Spring团队的建议是你在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。...你当然可以在接口上使用 @Transactional 注解,但是这将只能当你设置了基于接口的代理时它才生效。...因此,请接受Spring团队的建议并且在具体的类上使用 @Transactional 注解。 @Transactional 注解标识的方法,处理过程尽量的简单。
都可以回滚的 7、这个时候我们去看一下数据库的值到底有没有修改成功 很显然数据是被回滚了 并没有修改成0 1、下面我们在试试@Transactional不能过滚的异常 代码如下 我们直接先用try...catch来捕获异常 然后在catch里面自定义抛出Exception异常 @Override @Transactional public Ret test() throws Exception { ...只能回滚RuntimeException和RuntimeException下面的子类抛出的异常 不能回滚Exception异常 如果需要支持回滚Exception异常请用@Transactional(rollbackFor...= Exception.class) 这里如果是增删改的时候我建议大家都使用@Transactional(rollbackFor = Exception.class) 补充一下@Transactional...(rollbackFor = Exception.class)一些失效的场景: 1、不是用public修饰 2、try catch捕获了异常(没有在catch里面手动抛出异常) 3、没有加@Service
@Transactional(noRollbackFor=Exception.class) @Transactional(rollbackFor = Exception.class,propagation...= Propagation.REQUIRES_NEW) //使被调用者不受调用者的异常影响,出现异常之后,使父方法回滚,子方法不回滚 @Transactional(rollbackFor = Exception.class...@Transactional(rollbackFor = Exception.class,propagation = Propagation.MANDATORY):使用当前的事务,如果当前没有事务,就抛出异常...@Transactional(rollbackFor = Exception.class,propagation = Propagation.NEVER):以非事务方式执行,如果当前存在事务,则抛出异常...@Transactional(rollbackFor = Exception.class,propagation = Propagation.NESTED):如果当前存在事务,则在嵌套事务内执行。
属性 @Transactional(rollbackFor = Exception.class) 2....(rollbackFor = Exception.class) public void transfer(int from, int to, int amount) { try...(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) public void bar() throws...(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) public void bar() throws...(rollbackFor = Exception.class) public synchronized void transfer(int from, int to, int amount)
; } @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public...Propagation_Supports @Transactional(propagation = Propagation.SUPPORTS, rollbackFor = Exception.class...; } @Test @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)...; } @Test @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)...; } @Test @Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
(rollbackFor = Exception.class) public void addUser1(User user) { userRepository.save(user); } @Transactional...(new User(“user4”)); } @Transactional(rollbackFor = Exception.class) public void addUser4(User user)...(new User(“user6”)); } @Transactional(rollbackFor = Exception.class) public void addUser6(User user)...(new User(“user8”)); } @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class...(new User(“user10”)); } @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class
(rollbackFor = Exception.class,propagation = Propagation.REQUIRED) @Override public Integer updateTest...❞ 答案是:「会回滚」 来看下测试代码,我们在A方法中添加了捕获B方法抛出异常的代码 @Transactional(rollbackFor = Exception.class,propagation =...答案是:「不会」 ❞ 把B接口的代码改一下 @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRED...(rollbackFor = Exception.class,propagation = Propagation.MANDATORY) @Override public Integer...Propagation.REQUIRES_NEW A方法调用B方法,如果A方法有事务,则B方法把A方法的事务挂起,B方法自己重新开启一个新事务 A方法 @Transactional(rollbackFor
当执行的代码再次遇到 @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class) 标注的注解就会再次重新上面的流程...(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class) public void test1() {...(propagation = Propagation.MANDATORY, rollbackFor = Exception.class) public void test1() {...@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public void test1...@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public void test1
(propagation = Propagation.REQUIRES_NEW,rollbackFor = Exception.class) public void insertB() {...@Transactional(rollbackFor = Exception.class)public ActivityPrize award(Integer appId, String uid, Integer...(rollbackFor = Exception.class)@Transactional(rollbackFor = Exception.class)@Overridepublic Boolean awardPrize...(propagation = Propagation.REQUIRED,rollbackFor = Exception.class) public void insertA() {...所以要求事务一致,可以将A改成: @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class)
/** * 事务不生效场景:异常未被正确捕获和抛出 */ @Transactional(rollbackFor = Exception.class) public void.../** * 事务不生效场景:在非公共方法上使用@Transactional */ @Transactional(rollbackFor = Exception.class.../** * method6中调用method7,会共享method6方法的事务 */ @Transactional(rollbackFor = Exception.class.../** * method8中调用method9,method9会重新开启个事务 */ @Transactional(rollbackFor = Exception.class...(rollbackFor = Exception.class,propagation= Propagation.REQUIRES_NEW) public void method9(){
A方法 注解@Transactional(rollbackFor = Exception.class) 开启A方法的事务 其中: goodsService.importData3(); 调用B方法或者采用...SpringUtils.getAopProxy(this).importData3(); 调用B方法均可以,这里try catch B方法异常是为了防止B方法造成的异常影响到A方法的插入 代码如下: @Override @Transactional...(rollbackFor = Exception.class) public Map importData(MultipartFile file, String examId, String subjectId...(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW)开启B方法的新事务,且A方法与B方法不属于同一个事务 @...Override @Transactional(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW) public
声明式事务@Transactional避坑 崔认知,公众号:认知科技技术团队Spring避坑指南:Spring声明式事务@Transactional避坑 所以,我们必须在配置: @Transactional...(rollbackFor = Exception.class) Java 注解处理器自动检查代码 Java 注解处理器(Annotation Processor)由于是在编译期处理注解,处理的注解必须在编译期被保留...= Exception.class的自定义注解处理器: package org.renzhikeji; import com.google.auto.service.AutoService; import...rollbackFor=Exception.class== 处理 "); Set<?...message.isEmpty()) { throw new RuntimeException("使用spring的事务注解Transactional,请配置rollbackFor
2.用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义 3.在项目中,@Transactional(rollbackFor=Exception.class...4.在@Transactional注解中如果不配置rollbackFor属性,那么事物只会在遇到RuntimeException的时候才会回滚,加上rollbackFor=Exception.class...@Transactional 注解属性 rollbackFor 设置错误 rollbackFor 可以指定能够触发事务回滚的异常类型。...@Transactional(rollbackFor = Exception.class) 在@Transactional注解中如果不配置rollbackFor属性,那么事物只会在遇到RuntimeException...的时候才会回滚,加上rollbackFor=Exception.class,可以让事物在遇到非运行时异常时也回滚。
(rollbackFor = Exception.class, propagation = Propagation.REQUIRED) public void methodA() {...(rollbackFor = Exception.class, propagation = Propagation.REQUIRED) public void methodB() {...(rollbackFor = Exception.class, propagation = Propagation.NOT_SUPPORTED) public void methodB() {...(rollbackFor = Exception.class, propagation = Propagation.NEVER) public void methodB() {...update(); } } //服务B @Service public class ServiceB { @Transactional(rollbackFor = Exception.class
(rollbackFor = Exception.class) public void hasTransactional() throws RollbackException { } // 无事务...(rollbackFor = Exception.class) public void hasTransactional() throws RollbackException {...(rollbackFor = Exception.class,propagation = Propagation.SUPPORTS) public void testSupportsNoException...被调用者 // REQUIRES_NEW传播属性-被调用者有异常抛出 @Override @Transactional(rollbackFor = Exception.class,propagation...(rollbackFor = Exception.class,propagation = Propagation.NESTED) public void testNestedHasException()
(propagation = Propagation.REQUIRED, rollbackFor = Exception.class) public void insertClassByException...(propagation = Propagation.NESTED, rollbackFor = Exception.class) public void insertClass(ClassDo...,rollbackFor = Exception.class) @Override @Transactional(propagation = Propagation.REQUIRED,rollbackFor...(propagation = Propagation.REQUIRED,rollbackFor = Exception.class) public void insertClassByException...解决方案:捕获异常并抛出异常 @Override @Transactional(propagation = Propagation.REQUIRED,rollbackFor = Exception.class
* 服务实现类 * * * @author * @since 2021/7/30 10:31 */ @Service @Transactional...(rollbackFor = Exception.class) @RequiredArgsConstructor(onConstructor = @__(@Autowired)) public class...; @Service @Transactional( rollbackFor = {Exception.class} ) public class UserDetailServiceImpl...(rollbackFor = Exception.class) @RequiredArgsConstructor(onConstructor = @__({@Autowired,@Lazy})) public...; @Service @Transactional( rollbackFor = {Exception.class} ) public class UserDetailServiceImpl
领取专属 10元无门槛券
手把手带您无忧上云