Spring 启动 @Transactional 注释不起作用
Spring Boot @Transactional annotation doesn't work
我的 signupUser 方法保存一个用户并向注册的电子邮件地址发送一封电子邮件。如果电子邮件发送失败,则必须回滚保存的用户数据。我在 signupUser 方法上添加了 @Transactional
但当发生异常并且数据被永久保存时它不会回滚。我暂时用简单的 throw RunTimeException
替换了发送电子邮件部分,以检查交易是否有效,但结果是一样的(没有回滚)。
此方法在 @Controller
注释 class 中调用。
我做错了什么?
@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 你应该使用 import org.springframework.transaction.annotation.Transactional;
因为你使用的是 spring,而不是 EE
我发现是mySQL上的配置。我将引擎从默认引擎更改为 InnoDB,它工作正常!
如果注释不起作用,您可以尝试另一种方法,修改您的服务class,如下面的代码
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 将替换为名称密码等。试试这个,它会起作用
我的 signupUser 方法保存一个用户并向注册的电子邮件地址发送一封电子邮件。如果电子邮件发送失败,则必须回滚保存的用户数据。我在 signupUser 方法上添加了 @Transactional
但当发生异常并且数据被永久保存时它不会回滚。我暂时用简单的 throw RunTimeException
替换了发送电子邮件部分,以检查交易是否有效,但结果是一样的(没有回滚)。
此方法在 @Controller
注释 class 中调用。
我做错了什么?
@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 你应该使用 import org.springframework.transaction.annotation.Transactional;
因为你使用的是 spring,而不是 EE
我发现是mySQL上的配置。我将引擎从默认引擎更改为 InnoDB,它工作正常!
如果注释不起作用,您可以尝试另一种方法,修改您的服务class,如下面的代码
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 将替换为名称密码等。试试这个,它会起作用