您现在的位置是:首页 >其他 >springboot 事务管理网站首页其他
springboot 事务管理
在Spring Boot中,事务管理是通过Spring框架的事务管理模块来实现的。Spring提供了声明式事务管理和编程式事务管理两种方式。通常,我们使用声明式事务管理,因为它更简洁且易于维护。
1. 声明式事务管理
声明式事务管理是通过注解来实现的。Spring Boot中使用@Transactional注解来标记需要事务管理的方法或类。
1.1 配置事务管理器
Spring Boot默认使用DataSourceTransactionManager来管理事务。如果你使用的是Spring Boot的自动配置,通常不需要手动配置事务管理器。但如果你有特殊需求,可以手动配置:
java
复制
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.sql.DataSource;
@Configuration
@EnableTransactionManagement
public class TransactionConfig {
@Bean
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}
1.2 使用@Transactional注解
你可以在方法或类上使用@Transactional注解来声明事务。当方法被调用时,Spring会自动开启事务,并在方法执行完成后提交事务。如果方法抛出异常,事务会回滚。
java
复制
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
@Transactional
public void createUser(User user) {
userRepository.save(user);
}
@Transactional
public void updateUser(User user) {
userRepository.save(user);
}
@Transactional(readOnly = true)
public User getUserById(Long id) {
return userRepository.findById(id).orElse(null);
}
}
1.3 事务传播行为
@Transactional注解还支持配置事务的传播行为。例如:
java
复制
@Transactional(propagation = Propagation.REQUIRED)
public void someMethod() {
// 业务逻辑
}
常见的传播行为包括:
-
REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。 -
REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则挂起当前事务。 -
SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。 -
NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,则挂起当前事务。 -
MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。 -
NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。 -
NESTED:如果当前存在事务,则在嵌套事务内执行;如果当前没有事务,则创建一个新的事务。
1.4 事务隔离级别
@Transactional注解还支持配置事务的隔离级别。例如:
java
复制
@Transactional(isolation = Isolation.READ_COMMITTED)
public void someMethod() {
// 业务逻辑
}
常见的隔离级别包括:
-
DEFAULT:使用底层数据库的默认隔离级别。 -
READ_UNCOMMITTED:允许读取未提交的数据变更。 -
READ_COMMITTED:只能读取已提交的数据变更。 -
REPEATABLE_READ:确保在同一事务中多次读取同一数据时,结果一致。 -
SERIALIZABLE:最高的隔离级别,确保事务串行执行。
1.5 事务回滚规则
默认情况下,@Transactional注解会在遇到RuntimeException及其子类时回滚事务。你可以通过rollbackFor和noRollbackFor属性来指定回滚的异常类型。
java
复制
@Transactional(rollbackFor = Exception.class)
public void someMethod() throws Exception {
// 业务逻辑
}
2. 编程式事务管理
编程式事务管理是通过编写代码来手动管理事务的。虽然这种方式更灵活,但代码会显得更复杂。
2.1 使用TransactionTemplate
TransactionTemplate是Spring提供的一个工具类,用于简化编程式事务管理。
java
复制
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.support.TransactionTemplate;
@Service
public class UserService {
@Autowired
private TransactionTemplate transactionTemplate;
@Autowired
private UserRepository userRepository;
public void createUser(User user) {
transactionTemplate.execute(status -> {
userRepository.save(user);
return null;
});
}
}
2.2 使用PlatformTransactionManager
你也可以直接使用PlatformTransactionManager来手动管理事务。
java
复制
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
@Service
public class UserService {
@Autowired
private PlatformTransactionManager transactionManager;
@Autowired
private UserRepository userRepository;
public void createUser(User user) {
TransactionDefinition definition = new DefaultTransactionDefinition();
TransactionStatus status = transactionManager.getTransaction(definition);
try {
userRepository.save(user);
transactionManager.commit(status);
} catch (Exception e) {
transactionManager.rollback(status);
throw e;
}
}
}
3. 总结
-
声明式事务管理:通过
@Transactional注解实现,推荐使用。 -
编程式事务管理:通过
TransactionTemplate或PlatformTransactionManager实现,适用于复杂场景。
Spring Boot的事务管理非常强大且灵活,能够满足大多数应用场景的需求。





U8W/U8W-Mini使用与常见问题解决
QT多线程的5种用法,通过使用线程解决UI主界面的耗时操作代码,防止界面卡死。...
stm32使用HAL库配置串口中断收发数据(保姆级教程)
分享几个国内免费的ChatGPT镜像网址(亲测有效)
Allegro16.6差分等长设置及走线总结