java @Transactional 注解类内部调用不回滚问题解决

java

今天帮同事看一个问题,关于事务在同一个类中,一个方法调用另一个方法 事务不回滚问题,这问题以前也遇到过,不过这次是在springboot项目中来解决,现在直接把方法写出来。

1. POM文件引入 如下:

        <dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-aop</artifactId>

</dependency>

<dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjweaver</artifactId>

<version>1.9.5</version>

</dependency>

2. 在springboot启动类上,添加注解,如下:

package com.szl;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

import org.springframework.context.annotation.EnableAspectJAutoProxy;

@EnableAspectJAutoProxy(exposeProxy = true)

@SpringBootApplication

public class DemoSzlApplication {

public static void main(String[] args) {

SpringApplication.run(DemoSzlApplication.class, args);

}

}

3. 主要实现类,如下:

package com.szl.service.impl;

import com.szl.mapper.DemoSzlMapper;

import com.szl.mapper.entity.DemoSzl;

import com.szl.service.DemoSzlService;

import org.springframework.aop.framework.AopContext;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import org.springframework.transaction.annotation.Propagation;

import org.springframework.transaction.annotation.Transactional;

import java.beans.Transient;

import java.util.Date;

@Service("demoSzlService")

public class DemoSzlServiceImpl implements DemoSzlService {

@Autowired

private DemoSzlMapper demoSzlMapper;

@Override

@Transactional

public void saveTest1() {

DemoSzl ds1 = new DemoSzl("szl001", new Date());

demoSzlMapper.insert(ds1);

try {
// 此处如果方法执行失败,就可以回滚成功。

((DemoSzlServiceImpl) AopContext.currentProxy()).saveTest2();

} catch (Exception e) {

e.printStackTrace();

}

}

@Override

@Transactional(propagation = Propagation.REQUIRES_NEW)

public void saveTest2() {

try {

DemoSzl ds2 = new DemoSzl("szl002", new Date());

demoSzlMapper.insert(ds2);

int t = 1 / 0;

} catch (Exception e) {

e.printStackTrace();

throw new RuntimeException("错误");

}

}

}

OK, 记录完毕,以上本人亲测已验证。

以上是 java @Transactional 注解类内部调用不回滚问题解决 的全部内容, 来源链接: utcz.com/z/393254.html

回到顶部