Spring——编程式事务

目录

platformtransactionManager

TransactionDefinition

TransactionStatus

编程式事务

PlatformTransactionManager手动管理事务

TransactionTemplate管理事务


platformtransactionManager

platformtransactionManager是**spring处理事务的核心接口,**为不同的事务管理实现提供了一个统一的编程模型。Spring本身不管理事务,而是通过这个接口适配各种底层的事务机制。该接口有3个方法。

java 复制代码
public interface PlatformTransactionManager {

    // 获取一个事务(根据定义创建或加入已有事务)
    TransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException;

    // 提交事务
    void commit(TransactionStatus status) throws TransactionException;

    // 回滚事务
    void rollback(TransactionStatus status) throws TransactionException;
}

核心方法说明:

  • getTransaction(TransactionDefinition definition)

    • 根据事务定义(传播行为、隔离级别、超时等)获取一个事务。
    • 如果当前线程已有事务,根据传播行为决定是加入还是新建。
    • 返回 TransactionStatus 对象,表示当前事务状态。
  • commit(TransactionStatus status)

    • 提交事务。
    • 如果事务已标记为 rollback-only,则执行回滚。
  • rollback(TransactionStatus status)

    • 回滚事务。

TransactionDefinition

TransactionDefinition用于定义事务的属性,描述事务的边界和行为规则。

主要内容:

  • 传播行为(Propagation)

    • REQUIRED(默认):如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务

    • REQUIRES_NEW:创建一个新的事务,如果当前存在事务,则把当前事务挂起

    • NESTED:如果当前存在事务,则创建一个事务作为当前事务的嵌套事务;如果当前没有事务,则等价于REQUIRED

    • SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行

    • NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起

    • NEVER:以非事务方式运行,如果当前存在事务,则抛出异常

    • MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常

  • 隔离级别(Isolation)

    • DEFAULT:使用底层数据库的默认隔离级别

    • READ_UNCOMMITTED:读未提交

    • READ_COMMITTED:读已提交

    • REPEATABLE_READ:可重复读

    • SERIALIZABLE:串行化

  • 超时时间(Timeout)

  • 是否只读(Read-only)

TransactionStatus

TransactionStatus接口表示事务的状态,用于在事务的执行过程中查询状态和控制事务。

java 复制代码
public interface TransactionStatus extends SavepointManager {
    
    // 判断是否是新的事务
    boolean isNewTransaction();
    
    // 判断是否有保存点
    boolean hasSavepoint();
    
    // 设置事务为只回滚
    void setRollbackOnly();
    
    // 判断事务是否已被标记为只回滚
    boolean isRollbackOnly();
    
    // 判断事务是否已完成
    boolean isCompleted();
}

编程式事务

编程式事务可以在代码中显示的调用事务管理API来控制事务边界。

PlatformTransactionManager手动管理事务

首先在spring的配置文件中提供一个事务管理器:

XML 复制代码
<bean class="org.springframework.transaction.support.TransactionTemplate" id="transactionTemplate">
        <property name="transactionManager" ref="transactionManager"/>
</bean>

然后注入到service层,并且编写对应的方法,这里使用ORM的是mybatis:

java 复制代码
public class UserService {

    @Autowired
    PlatformTransactionManager platformTransactionManager;
    @Autowired
    UserDao userDao;

    public void trans(){
        //1.定义默认的事务属性
        DefaultTransactionDefinition definition = new DefaultTransactionDefinition();
        //2.获取TransactionStatus
        TransactionStatus transaction = platformTransactionManager.getTransaction(definition);
        try{
            userDao.updateUsernameById(1,"6k");
            platformTransactionManager.commit(transaction);
        }catch (Exception e){
            platformTransactionManager.rollback(transaction);

        }
    }
}

运行启动调用这个方法之后发现确实修改成功了,看起来加没加事务没有什么区别。接下来在后面抛个异常:

发现即使已经调用了接口中的方法,数据依旧没有修改,说明这个事务被回滚了

TransactionTemplate管理事务

依旧在spring配置文件中提供事务管理器./

XML 复制代码
<bean class="org.springframework.transaction.support.TransactionTemplate" id="transactionTemplate">
        <property name="transactionManager" ref="transactionManager"/>
</bean>

注入TransactionTemplate

java 复制代码
@Autowired
TransactionTemplate transactionTemplate;
java 复制代码
/**
 * 基于TransactionTemplate的编程式事务方法(trans2)
 * 说明:TransactionTemplate是Spring提供的事务模板类,简化了编程式事务的代码(无需手动commit/rollback)
 */
public void trans2(){
    // 调用TransactionTemplate的execute方法,传入事务回调接口(TransactionCallbackWithoutResult)
    transactionTemplate.execute(new TransactionCallbackWithoutResult() {
        
        // 重写回调接口的doInTransactionWithoutResult方法
        // 作用:该方法内的代码会运行在事务环境中,TransactionStatus参数用于控制事务状态(如标记回滚)
        @Override
        protected void doInTransactionWithoutResult(TransactionStatus status) {
            try{
                // 说明:此操作会被Spring事务管理,若后续出现异常,该更新会被回滚
                userDao.updateUsernameById(1,"ojbk");
                int i = 1/0;
                
            }catch (Exception e){
                //  异常处理:当业务逻辑抛出异常时,手动标记事务为"需要回滚"
                status.setRollbackOnly();

            }
        }
    } );
}
相关推荐
编程充电站pro2 小时前
SQL 多表查询常用语法速查:INNER JOIN / LEFT JOIN / RIGHT JOIN
数据库·sql
杨云龙UP3 小时前
SQL Server数据库事务日志问题的诊断与解法(从膨胀到瘦身)
运维·数据库·sql·sqlserver·serverless
周杰伦的稻香4 小时前
MySQL5.7.44编译安装
数据库·mysql
reasonsummer4 小时前
【办公类-116-01】20250929家长会PPT(Python快速批量制作16:9PPT相册,带文件名,照片横版和竖版)
java·数据库·python·powerpoint
我是唐青枫4 小时前
深入掌握 FluentMigrator:C#.NET 数据库迁移框架详解
数据库·c#·.net
hqwest4 小时前
QT肝8天15--左侧静态菜单
开发语言·数据库·qt·qt开发·ui控件
青衿先生7 小时前
返璞归真-SQL基本语法
数据库·sql
weixin_456904278 小时前
数据库设计与UML图
数据库·uml
codecrafter1238 小时前
MATLAB中的while循环:从入门到精通的完整指南
java·数据库·其他·matlab