springboot单独开启和提交事务
单独开启事务:
在SpringBoot中,可以通过在方法上添加注解@Transactional来开启事务。默认情况下,SpringBoot使用的是基于注解的声明式事务管理。当使用@Transactional注解时,SpringBoot会自动为该方法开启事务,并在方法执行完成后提交事务。如果方法执行过程中发生异常,则会回滚事务。
示例:
@Service
public class UserService {
@Autowired
private UserDao userDao;
@Transactional
public void addUser(User user) {
userDao.addUser(user);
}
}
在上面的示例中,我们在addUser方法上添加了@Transactional注解,这样就可以开启事务了。当方法执行完成后,SpringBoot会自动提交事务。
提交事务:
当使用基于注解的声明式事务管理时,SpringBoot会自动为我们管理事务的提交和回滚。因此,在一般情况下,我们不需要手动提交或回滚事务。
但是,在某些特殊情况下,我们可能需要手动提交或回滚事务,比如在使用JdbcTemplate等直接操作数据库的情况下。这时,我们可以使用Spring提供的TransactionTemplate来手动提交或回滚事务。
示例:
@Service
public class UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private TransactionTemplate transactionTemplate;
public void addUser(User user) {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
jdbcTemplate.update("INSERT INTO user(name, age) VALUES (?, ?)", user.getName(), user.getAge());
}
});
}
public void updateUser(User user) {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
jdbcTemplate.update("UPDATE user SET name = ?, age = ? WHERE id = ?", user.getName(), user.getAge(), user.getId());
}
});
}
public void deleteUser(Long id) {
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus transactionStatus) {
jdbcTemplate.update("DELETE FROM user WHERE id = ?", id);
}
});
}
}
在上面的示例中,我们使用了TransactionTemplate来手动提交或回滚事务。在每个方法中,我们都使用transactionTemplate.execute()方法来执行事务,并在内部传入一个TransactionCallbackWithoutResult对象来执行具体的数据库操作。当方法执行完成后,SpringBoot会自动提交事务。如果方法执行过程中发生异常,则会回滚事务。
原文地址: https://www.cveoy.top/t/topic/s9I 著作权归作者所有。请勿转载和采集!