• 声明式事务@Transactional


    事务

    事务管理在 Web 系统开发中是非常重要的,可以在一定程度上保证数据的一致性。Spring提供了非常优秀的事务管理机制,主要分为:

    • 编程式事务
    • 声明式事务

    编程式事物

    在代码中手动的管理事务的提交、回滚等操作,代码侵入性比较强。

    try {
        // TODO 
        transactionManager.commit(status);
    } catch (Exception e) {
        transactionManager.rollback(status);
        throw new Exception("transaction fail");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    声明式事物

    基于 AOP 面向切面的,它将具体业务与事务处理部分解耦,代码侵入性很低,在实际开发中使用声明式事务用的比较多。

    声明式事务也有两种实现方式,

    • 基于TX和AOP的xml配置文件的方式,
    • 基于@Transactional注解的方式。

    显然基于注解的方式更简单易用。

    @Transactional
    public boolean updateUser(User user){
    	return userMapper.updateById(user) > 0;
    }
    
    • 1
    • 2
    • 3
    • 4

    @Transactional

    @Transactional 可以作用在接口、类、类方法。

    作用于类:

    如果把@Transactional 注解放在类上时,表示所有该类的public方法都配置相同的事务属性信息。

    作用于方法:

    如果类配置了@Transactional,方法也配置了@Transactional,方法的事务会覆盖类的事务配置信息。

    作用于接口:

    如果标注在 Interface 上并且配置了 Spring AOP 使用 CGLib 动态代理,将会导致@Transactional 注解失效,一般不使用在接口上。

    @Transactional的属性

    propagation

    表示事务的传播行为,默认值为 Propagation.REQUIRED

    • Propagation.REQUIRED:如果当前存在事务,则加入该事务,如果当前不存在事务,则创建一个新的事务。

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

    • Propagation.MANDATORY:如果当前存在事务,则加入该事务;如果当前不存在事务,则抛出异常。

    • Propagation.REQUIRES_NEW:重新创建一个新的事务,如果当前存在事务,暂停当前的事务。

    • Propagation.NOT_SUPPORTED:以非事务的方式运行,如果当前存在事务,暂停当前的事务。

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

    • Propagation.NESTED :和 Propagation.REQUIRED 效果一样。

    isolation

    事务的隔离级别,默认值为 Isolation.DEFAULT , 使用底层数据库默认的隔离级别。
    在这里插入图片描述

    • Isolation.DEFAULT
    • Isolation.READ_UNCOMMITTED
    • Isolation.READ_COMMITTED
    • Isolation.REPEATABLE_READ
    • Isolation.SERIALIZABLE

    timeout

    事务的超时时间,默认值为 -1。如果超过该时间限制但事务还没有完成,则自动回滚事务。

    readOnly

    指定事务是否为只读事务,默认值为 false;读取数据的时候,可以设置 read-only 为 true。

    rollbackFor

    用于指定能够触发事务回滚的异常类型,可以指定多个异常类型。

    noRollbackFor

    抛出指定的异常类型,不回滚事务,也可以指定多个异常类型。

  • 相关阅读:
    kibana配置文件中明文密码加密
    软考系统分析师备考经验分享:论持久战
    Java 函数式编程
    带你掌握Redis中的数据类型
    NOIP2000提高组第二轮T2:乌龟棋
    痞子衡嵌入式:MCUXpresso IDE下设置代码编译优化等级的几种方法
    记一次WPF集成SemanticKernel+OneAPI+讯飞星火认知大模型实践
    嵌入式学习笔记(59)内存管理之栈
    Linux基础开发工具之yum与vim
    java中的File类(文件操控者)
  • 原文地址:https://blog.csdn.net/upstream480/article/details/127941345