当前位置:实例文章 » JAVA Web实例» [文章]每日一题:SpringBoot中支持的事务类型

每日一题:SpringBoot中支持的事务类型

发布人:shili8 发布时间:2024-12-22 14:18 阅读次数:0

**每日一题:SpringBoot中支持的事务类型**

在 Spring Boot 中,事务是指一组操作的集合,如果其中任何一个操作失败,则整个事务都会回滚,这样可以保证数据的一致性。Spring Boot 支持多种事务类型,我们将在本文中详细介绍。

###1. 声明式事务声明式事务是 Spring Boot 中最常用的事务类型,它通过注解的方式来定义事务的边界。

java@Servicepublic class UserService {
 @Autowired private UserMapper userMapper;

 @Transactional // 这里使用@Transactional注解开启事务 public void saveUser(User user) {
 userMapper.insert(user);
 // 如果这里插入失败,整个事务都会回滚 int i =1 /0;
 }
}


在上面的例子中,我们使用 `@Transactional` 注解开启了一个事务,如果 `saveUser` 方法中的任何操作失败,则整个事务都会回滚。

###2. 编程式事务编程式事务是通过代码的方式来定义事务的边界,它比声明式事务更灵活,但也更容易出错。

java@Servicepublic class UserService {
 @Autowired private UserMapper userMapper;

 public void saveUser(User user) {
 TransactionStatus status = TransactionAspectSupport.currentTransactionStatus();
 if (status.isRollbackOnly()) {
 // 如果当前事务已经回滚,则不再进行任何操作 return;
 }
 try {
 userMapper.insert(user);
 // 如果这里插入失败,需要手动回滚事务 int i =1 /0;
 } catch (Exception e) {
 status.setRollbackOnly();
 throw new RuntimeException(e);
 }
 }
}


在上面的例子中,我们通过 `TransactionAspectSupport.currentTransactionStatus()` 获取当前事务的状态,如果当前事务已经回滚,则不再进行任何操作。如果这里插入失败,则需要手动回滚事务。

###3. PROPAGATION类型Spring Boot 中支持多种 PROPAGATION 类型,它们决定了事务如何传播到下一个方法中。

java@Servicepublic class UserService {
 @Autowired private UserMapper userMapper;

 public void saveUser(User user) {
 // REQUIRED:如果当前线程存在事务,则使用该事务,否则新建一个事务 TransactionTemplate transactionTemplate = new TransactionTemplate();
 transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
 transactionTemplate.execute(new TransactionCallback() {
 @Override public Object doInTransaction(TransactionStatus status) {
 userMapper.insert(user);
 // 如果这里插入失败,整个事务都会回滚 int i =1 /0;
 return null;
 }
 });
 }
}


在上面的例子中,我们使用 `REQUIRED` 类型传播当前线程的事务,如果当前线程不存在事务,则新建一个事务。

###4. ISOLATION类型Spring Boot 中支持多种 ISOLATION 类型,它们决定了事务如何隔离其他操作。

java@Servicepublic class UserService {
 @Autowired private UserMapper userMapper;

 public void saveUser(User user) {
 // DEFAULT:使用数据库的默认隔离级别 TransactionTemplate transactionTemplate = new TransactionTemplate();
 transactionTemplate.setIsolationLevel(TransactionDefinition.ISOLATION_DEFAULT);
 transactionTemplate.execute(new TransactionCallback() {
 @Override public Object doInTransaction(TransactionStatus status) {
 userMapper.insert(user);
 // 如果这里插入失败,整个事务都会回滚 int i =1 /0;
 return null;
 }
 });
 }
}


在上面的例子中,我们使用 `DEFAULT` 类型隔离当前线程的操作,如果其他线程正在执行相同的操作,则会出现死锁。

###5. TIMEOUT类型Spring Boot 中支持多种 TIMEOUT 类型,它们决定了事务超时时间。

java@Servicepublic class UserService {
 @Autowired private UserMapper userMapper;

 public void saveUser(User user) {
 // DEFAULT:使用数据库的默认超时时间 TransactionTemplate transactionTemplate = new TransactionTemplate();
 transactionTemplate.setTimeout(TransactionDefinition.TIMEOUT_DEFAULT);
 transactionTemplate.execute(new TransactionCallback() {
 @Override public Object doInTransaction(TransactionStatus status) {
 userMapper.insert(user);
 // 如果这里插入失败,整个事务都会回滚 int i =1 /0;
 return null;
 }
 });
 }
}


在上面的例子中,我们使用 `DEFAULT` 类型超时当前线程的操作,如果超时时间到达,则会出现异常。

综上所述,Spring Boot 支持多种事务类型,它们决定了事务如何传播、隔离和超时。通过选择合适的类型,可以实现高效的数据一致性和可靠性。

其他信息

其他资源

Top