Spring Boot @Transactional注释不起作用

问题描述

我的signupUser方法保存用户并将电子邮件发送到注册的电子邮件地址。如果电子邮件发送失败,则必须回滚保存的用户数据。我在signupUser方法添加@Transactional,但是当发生异常并且数据被永久保存时,它不会回滚。我暂时用简单的throw RunTimeException代替了发送电子邮件的部分,以检查事务处理是否可行,但结果相同(没有回滚)。

方法在带有注释的@Controller类中调用

我在做什么错了?

@Service
public class AuthService {

        private UserRepository userRepository;
        private final Logger logger = LoggerFactory.getLogger(AuthService.class);
        private CustomMailSender mailSender;
        private modelmapper modelmapper;

        @Autowired
        private PasswordEncoder passwordEncoder;


    @Autowired
        public AuthService(UserRepository userRepository,CustomMailSender mailSender,modelmapper modelmapper) {
            this.userRepository = userRepository;
            this.mailSender= mailSender;
            this.modelmapper = modelmapper;
        }

 
    @Transactional
      public void signupUser(SignUpForm signUpForm){
        userRepository.save(new User(signUpForm.getUsername(),passwordEncoder.encode(signUpForm.getpassword()),signUpForm.getEmail()));
        throw new RuntimeException("腹たつ");

        }

解决方法

嗯,IMO,您应该使用struct A { int a0; char a1; } bcuz,而不是EE

,

我发现这是mySQL上的配置。我将引擎从默认引擎更改为InnoDB,并且可以正常工作!

Spring boot @Transactional doesn't rollback

,

如果注释不起作用,您可以尝试使用相同的替代方法,如下所示修改服务类

public void signupUser(SignUpForm signUpForm){
        userRepository.add(signUpForm.getUsername(),passwordEncoder.encode(signUpForm.getPassword()),signUpForm.getEmail());
        throw new RuntimeException("腹たつ");

        }

将以下代码添加到存储库中

@Transactional
@Modifying
@Query(value="insert into..... ?1 ?2 ?3",nativeQuery=true)
void add(name,password,email);

因此从您的服务中只需调用方法add并传递3个参数,此处?1,?2将替换为名称密码等。尝试使用此方法,它将起作用