SpringBoot 事务管理:单独开启事务和手动提交事务
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/lFeA 著作权归作者所有。请勿转载和采集!