Spring Boot的事务

事务

事务(Transaction)是指在数据库中执行的一组操作,这些操作要么全部执行成功,要么全部失败回滚。事务是确保数据一致性和完整性的重要机制,也是支持并发访问的基础。

在数据库中,事务具有四个特性,通常称为ACID属性:

原子性(Atomicity):事务中的操作作为一个整体被执行,要么全部成功,要么全部失败回滚,不会出现部分执行的情况;
一致性(Consistency):事务执行前后,数据应该保持一致性状态,即满足所有定义的约束条件;
隔离性(Isolation):多个事务同时对数据库进行操作时,每个事务都应该感觉不到其他事务的存在,每个事务看到的数据应该是一致的;
持久性(Durability):一旦事务提交成功,对数据库的变更应该永久保存下来,即使系统发生故障也不应该丢失。
通过实现ACID属性,事务可以确保数据库的数据一致性和完整性,并且支持高并发操作。

1. 手动提交事务

在Spring Boot中,可以使用编程式事务管理来手动提交事务。以下是在Spring Boot中手动提交事务的示例代码:

import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;

// 在需要手动提交事务的方法中注入PlatformTransactionManager
@Autowired
private PlatformTransactionManager transactionManager;

// 在方法中手动提交事务
public void updateWithManualTransaction(JSONObject req) {
    // 定义事务属性
    TransactionDefinition transactionDefinition = new DefaultTransactionDefinition();

    // 开启事务
    TransactionStatus transactionStatus = transactionManager.getTransaction(transactionDefinition);

    try {
        // 执行业务逻辑
        // ...

        // 手动提交事务
        transactionManager.commit(transactionStatus);
    } catch (Exception e) {
        // 发生异常时回滚事务
        transactionManager.rollback(transactionStatus);
        throw e;
    }
}

在这个示例中,我们首先注入了PlatformTransactionManager,它是Spring提供的事务管理器。然后,通过创建TransactionDefinition来定义事务的属性,如隔离级别、传播行为等。接下来,使用transactionManager开启事务,并获取到TransactionStatus对象。在try块中执行业务逻辑,执行完成后调用transactionManager的commit方法手动提交事务。如果在执行业务逻辑过程中发生异常,会进入catch块,调用transactionManager的rollback方法回滚事务。

请注意,手动提交事务需要谨慎使用,并且需要遵循事务的原子性、一致性、隔离性和持久性等特性,以避免数据不一致的问题。

2. 注解提交事务

如果你使用@Transactional注解来开启事务,并且在某个方法中需要手动提交事务,可以使用编程式事务管理的方式来实现。以下是示例代码:

import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;

@Autowired
private PlatformTransactionManager transactionManager;

@Transactional(rollbackFor = Exception.class)
public void updateWithManualTransaction(JSONObject req) {
    // 获取当前事务
    TransactionStatus transactionStatus = TransactionAspectSupport.currentTransactionStatus();

    try {
        // 执行业务逻辑
        // ...

        // 手动提交事务
        transactionManager.commit(transactionStatus);
    } catch (Exception e) {
        // 发生异常时回滚事务
        transactionManager.rollback(transactionStatus);
        throw e;
    }
}

在这个示例中,我们在updateWithManualTransaction方法上使用了@Transactional注解来开启事务,并设置了rollbackFor = Exception.class,表示任何异常都会回滚事务。

在方法内部,通过调用TransactionAspectSupport.currentTransactionStatus()来获取当前事务的状态。然后,在try块中执行具体的业务逻辑,执行完成后调用transactionManager.commit(transactionStatus)来手动提交事务。如果在执行业务逻辑过程中发生异常,会进入catch块,调用transactionManager.rollback(transactionStatus)来回滚事务。

请注意,使用编程式事务管理时,需要谨慎处理事务的一致性,确保在手动提交事务之前的业务逻辑已经完成,并且不会发生异常。同时,也要注意事务的嵌套和传播行为,以避免意外的事务行为。

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值