首页 > 其他分享 >事务注解:@Transtation

事务注解:@Transtation

时间:2022-10-12 21:45:47浏览次数:96  
标签:回滚 事务 方法 Transactional Transtation 注解 异常

事务注解:@Transtation

@Transactional注解可以作用于接口、接口方法、类以及类方法上

  1. 当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性

  1. 当作用在方法级别时会覆盖类级别的定义

  1. 当作用在接口和接口方法时则只有在使用基于接口的代理时它才会生效,也就是JDK动态代理,而不是Cglib代理

  1. 当在 protected、private 或者默认可见性的方法上使用 @Transactional 注解时是不会生效的,也不会抛出任何异常

  1. 默认情况下,只有来自外部的方法调用才会被AOP代理捕获,也就是,类内部方法调用本类内部的其他方法并不会引起事务行为,即使被调用方法使用@Transactional注解进行修饰

@Transactional注解的可用参数

readOnly

该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false

rollbackFor

该属性用于设置需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,则进行事务回滚。

例如:

  1. 指定单一异常类:@Transactional(rollbackFor=RuntimeException.class)

  1. 指定多个异常类:@Transactional(rollbackFor={RuntimeException.class, BusnessException.class})

rollbackForClassName

该属性用于设置需要进行回滚的异常类名称数组,当方法中抛出指定异常名称数组中的异常时,则进行事务回滚。例如: 1. 指定单一异常类名称:@Transactional(rollbackForClassName=“RuntimeException”) 2. 指定多个异常类名称:@Transactional(rollbackForClassName={“RuntimeException”,“BusnessException”})

noRollbackFor

该属性用于设置不需要进行回滚的异常类数组,当方法中抛出指定异常数组中的异常时,不进行事务回滚

timeout

该属性用于设置事务的超时秒数,默认值为-1表示永不超时

propagation

该属性用于设置事务的传播行为 例如:@Transactional(propagation=Propagation.NOT_SUPPORTED)

事务为什么加在service层而不加在dao层

事务注解 @Transactional一般的话都加在service层,问了一些刚入行的朋友为什么,他们给的答案很模糊,所以自己去搜了下,下面是我的理解。

什么是事务? 在数据库中,所谓事务是指一组逻辑操作单元即一组sql语句。当这个单元中的一部分操作失败,整个事务回滚,只有全部正确才完成提交。判断事务是否配置成功的关键点在于出现异常时事务是否会回滚

事务四大特性

  1. 原子性(Atomicity) 原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

  2. 一致性(Consistency) 事务必须使数据库从一个一致性状态变换到另外一个一致性状态。(数据不被破坏

  1. 隔离性(Isolation) 事务的隔离性是指一个事务的执行不能被其他事务干扰.

  1. 持久性(Durability) 持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的.即使系统重启也不会丢失。

结合事务的特点,为什么加在service层就很好解释了。如果我们的事务注解@Transactional加在dao层,那么只要与数据库做增删改,就要提交一次事务,如此做事务的特性就发挥不出来,尤其是事务的一致性,当出现并发问题是,用户从数据库查到的数据都会有所偏差。 一般的时候,我们的service层可以调用多个dao层,我们只需要在service层加一个事务注解@Transactional,这样我们就可以一个事务处理多个请求,事务的特性也会充分的发挥出来。

也可以这么说:

因为一个Service完成一个服务,但是可能会调用很多个DAO层的功能,如果Transaction放在DAO层的话,做完一个DAO,就会提交一次事务,永久修改数据库,后面在调用另外一个DAO,但是throws Exception,对于整个的Service来说,应该是要完全回滚的,但是只能回滚到当前的DAO

所以这就破坏了事务的ACID

有一些项目的事务是在Controller层。

 

参考文章:

https://blog.csdn.net/jikefzz1095377498/article/details/81199693

https://blog.csdn.net/xiangwang2016/article/details/108187944/

我应该把@Transactional注释放在哪里:在接口定义上还是在实现类上? - 问答 - 腾讯云开发者社区-腾讯云 (tencent.com)

关于加@Transactional注解的方法之间调用,事务是否生效的问题 - 腾讯云开发者社区-腾讯云 (tencent.com)

spring的@Transactional注解详细用法 - 一人浅醉- - 博客园 (cnblogs.com)

标签:回滚,事务,方法,Transactional,Transtation,注解,异常
From: https://www.cnblogs.com/zhaostudy/p/16786202.html

相关文章

  • Redis事务以及锁的简单介绍
    Redis“耐心之树,结黄金之果”目录Redis“耐心之树,结黄金之果”1、NoSQL1.1NoSQL的四大分类:1.2NoSQL应用场景:2、Redis2.1redis-benchmark性能测试2.2基础3、事务......
  • SpringBoot 自定义注解 实现多数据源
    SpringBoot自定义注解实现多数据源前置学习需要了解注解、Aop、SpringBoot整合Mybatis的使用。数据准备基础项目代码:https://gitee.com/J_look/spring-boot-all-dem......
  • 事务-基本演示,默认自动提交和手动提交、事务的四大特征
    事务-基本演示CREATETABLEaccount(idintPRIMARYKEYauto_increment,nameVARCHAR(10),balanceDOUBLE);insertintoaccount(name,balance)VAL......
  • Mysql笔记-事务
    事务事务(Transaction)会把数据库从一种一致状态转换为另一种一致状态。在数据库提交工作时,要么所有修改都已经保存了,要么修改都不保存。事务是访问并更新数据库中各种数据项......
  • mysql事务处理用法与实例详解
    MySQL的事务支持不是绑定在MySQL服务器本身,而是与存储引擎相关1.MyISAM:不支持事务,用于只读程序提高性能2.InnoDB:支持ACID事务、行级锁、并发3.BerkeleyDB:支持事务  一......
  • java常用注解校验参数
    validation中内置的constraints注解描述@AssertFalse 所注解的元素必须是Boolean类型,且值为false@AssertTrue所注解的元素必须是Boolean类型,且值为true......
  • 分布式事务是什么?
    目录​​前言​​​​数据库事务​​​​分布式理论​​​​CAP定理​​​​BASE理论​​​​分布式事务​​​​一、两阶段提交(2PC)​​​​二、补偿事务(TCC)​​​​三、本......
  • MySQL事务篇:ACID原则、事务隔离级别及事务机制原理剖析
    引言众所周知,​​MySQL​​数据库的核心功能就是存储数据,通常是整个业务系统中最重要的一层,可谓是整个系统的“大本营”,因此只要​​MySQL​​存在些许隐患问题,对于整个系统......
  • @Resource 和@Autowired注解
    @Autowired注解是根据属性进行注入,例如BaseDAO,BaseDAOImpl继承BaseDAO,可以根据BaseDAO类型进行注入@Resource注解是根据属性和名称进行注入,比如BaseDAO,BaseDAOImpl和Bas......
  • 基于AOP的事务管理
    /**作者:呆萌老师*☑csdn认证讲师*☑51cto高级讲师*☑腾讯课堂认证讲师*☑网易云课堂认证讲师*☑华为开发者学堂认证讲师*☑爱奇艺千人名师计划成员*在这里给大家......