Transactional(事务)

1.依赖

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

2.启动类注解

@EnableTransactionManagement
public class ExactnessConsoleApplication {public static void main(String[] args) {SpringApplication.run(ExactnessConsoleApplication.class, args);}
}

3.双数据源配置
3.1数据源一

public DataSource getDataSource() {return createDataSource();
}
@Bean(name = "detTransactionManager")
public PlatformTransactionManager txManager(@Qualifier("detDataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);
}

3.2数据源2

@Bean(name = "shardDataSource")
public DataSource getDataSource() {return buildDataSource();
}
@Bean(name = "shardTransactionManager")
public PlatformTransactionManager txManager(@Qualifier("shardDataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);
}

4.service接口注解

@Transactional(value = "detTransactionManager",rollbackFor = Exception.class)
public BaseResultDTO addTest(BaseRequestDTO param) {

}

通常情况下我们在需要对一个service方法添加事务时,加上这个注解,如果发生unchecked exception,就会发生rollback,。

A. 一个功能是否要事务,必须纳入设计、编码考虑。不能仅仅完成了基本功能就ok。 B. 如果加了事务,必须做好开发环境测试(测试环境也尽量触发异常、测试回滚),确保事务生效。 C. 以下列了事务使用过程的注意事项,请大家留意。

  1. 不要在接口上声明@Transactional ,而要在具体类的方法上使用 @Transactional 注解,否则注解可能无效。

  2. 不要图省事,将@Transactional放置在类级的声明中,放在类声明,会使得所有方法都有事务。故@Transactional应该放在方法级别,不需要使用事务的方法,就不要放置事务,比如查询方法。否则对性能是有影响的。

  3. 使用了@Transactional的方法,对同一个类里面的方法调用, @Transactional无效。比如有一个类Test,它的一个方法A,A再调用Test本类的方法B(不管B是否public还是private),但A没有声明注解事务,而B有。则外部调用A之后,B的事务是不会起作用的。(经常在这里出错)

  4. 使用了@Transactional的方法,只能是public,@Transactional注解的方法都是被外部其他类调用才有效,故只能是public。道理和上面的有关联。故在 protected、private 或者 package-visible 的方法上使用 @Transactional 注解,它也不会报错,但事务无效。

  5. 经过在ICORE-CLAIM中测试,效果如下:

  6. A.抛出受查异常XXXException,事务会回滚。

  7. B.抛出运行时异常NullPointerException,事务会回滚。

  8. C.Quartz中,execute直接调用加了@Transactional方法,可以回滚;间接调用,不会回滚。(即上文3点提到的)

  9. D.异步任务中,execute直接调用加了@Transactional方法,可以回滚;间接调用,不会回滚。(即上文3点提到的)

  10. E.在action中加上@Transactional,不会回滚。切记不要在action中加上事务。

  11. F.在service中加上@Transactional,如果是action直接调该方法,会回滚,如果是间接调,不会回滚。(即上文3提到的)

  12. G.在service中的private加上@Transactional,事务不会回滚。

    @Transactional(readOnly = true)

    如果你一次执行单条查询语句,则没有必要启用事务支持,数据库默认支持SQL执行期间的读一致性; 如果你一次执行多条查询语句,例如统计查询,报表查询,在这种场景下,多条查询SQL必须保证整体的读一致性,否则,在前条SQL查询之后,后条SQL查询之前,数据被其他用户改变,则该次整体的统计查询将会出现读数据不一致的状态,此时,应该启用事务支持。

  1. 注意

    1.多数据源需要指定事物;

    2.在使用注解事物时,不要使用 finally来处理异常捕获的结果,该事物时切面处理,捕获到执行异常后进行数据回滚操作,该方法会导致事物不能捕获到异常,进而回滚失败。

           finally {return resultDTO;}

回滚的类

@Transactional 注解属性 rollbackFor 设置错误

rollbackFor 可以指定能够触发事务回滚的异常类型。Spring默认抛出了未检查unchecked异常(继承自 RuntimeException 的异常)或者 Error才回滚事务;其他异常不会触发回滚事务。如果在事务中抛出其他类型的异常,但却期望 Spring 能够回滚事务,就需要指定 rollbackFor属性。

// 希望自定义的异常可以进行回滚@Transactional(propagation= Propagation.REQUIRED,rollbackFor= MyException.class

若在目标方法中抛出的异常是 rollbackFor 指定的异常的子类,事务同样会回滚。Spring源码如下:

private int getDepth(Class> exceptionClass, int depth) {        if (exceptionClass.getName().contains(this.exceptionName)) {            // Fou

Transactional(事务)相关推荐

  1. @Transactional事务生效条件与样例

    @Transactional事务生效条件 @Transactional注释的方法,不能是private修饰 @Transactional注释的方法,必须是有接口的方法实现(通用的Spring面向接口编 ...

  2. SpringBoot 异常回滚 事务的使用___Springboot @Transactional 事务不回滚

    Springboot中事务的使用: 1.启动类加上@EnableTransactionManagement注解,开启事务支持(其实默认是开启的). 2.在使用事务的public(只有public支持事 ...

  3. 【Spring源码】Spring Transactional事务:传播机制(Propagation) 介绍 和 源码剖析

    [Spring源码]Spring Transactional事务:传播机制(Propagation) 源码剖析 关键词 AMethod调用BMethod,转载BMethod的角度来考虑:站在被调用者的 ...

  4. @Transactional事务中使用锁坑(@Transactional事务中使用锁失效)

    @Transactional事务中使用锁失效 说明: Spring中使用注解@Transactional作事务管理,@Transactional注解在方法上时,是方法完成之后才进行提交事务的 测试代码 ...

  5. @Transactional的用法详解及Transactional事务无效的源码分析

    数据库事务正确执行的四要素 1.原子性 事务是不可分割的最小的工作单元,事务内的操作要么全做,要么全不做,不能只做一部分. 2.一致性 事务执行前数据库的数据按照逻辑处于正确的状态,事务执行后数据库的 ...

  6. Java的@Transactional事务回滚

    @Transactional 基本原理概述 在应用系统调用声明@Transactional 的目标方法时,Spring Framework 默认使用 AOP 代理,在代码运行时生成一个代理对象,根据@ ...

  7. Spring官方都推荐使用的@Transactional事务,为啥我不建议使用!

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 事务管理在系统开发中是不可缺少的一部分,Spring提供了 ...

  8. @Transactional事务几点注意

    这里面有几点需要大家留意: A. 一个功能是否要事务,必须纳入设计.编码考虑.不能仅仅完成了基本功能就ok. B. 如果加了事务,必须做好开发环境测试(测试环境也尽量触发异常.测试回滚),确保事务生效 ...

  9. Spring提取@Transactional事务注解的源码解析

    声明:本文是自己在学习spring注解事务处理源代码时所留下的笔记: 难免有错误,敬请读者谅解!!! 1.事务注解标签 <tx:annotation-driven /> 2.tx 命名空间 ...

  10. @Transactional事务的使用和注意事项及其属性

    事务管理 提示 @Transactional注解只能应用到public可见度的方法上,可以被应用于接口定义和接口方法,方法会覆盖类上面声明的事务. 示例: 例如用户新增需要插入用户表.用户与岗位关联表 ...

最新文章

  1. 英特尔王锐:软硬件并驾齐驱,开发者是真英雄
  2. 设计模式之访问者模式、例子分析
  3. 【论文阅读】Clustering by Shift
  4. 直接载入内存中的DLL
  5. android通讯录管理(获取联系人,通话记录,短信消息),Android通讯录管理(获取联系人、通话记录、短信消息)(二)...
  6. mac 用惠普扫描仪扫描提示将对您的电脑造成伤害_惠普全能打印神器测评:15秒智能闪充、打一张仅需5分钱...
  7. couchbase_具有Couchbase,Java EE和WildFly的CRUD Java应用程序
  8. python纵向制表符命令_Python中raw_input()中子命令的制表符完成
  9. Who am I:最烧脑的社会工程学电影
  10. Linux开发环境——tftp服务器的搭建
  11. 如何更新一台计算机的驱动程序,怎样更新电脑最新驱动程序? -电脑资料
  12. 【附源码】小白打造「传奇游戏」 (一)
  13. python中上标星号怎么打_Python中参数前加星号的用法
  14. 国际化的locale类详解
  15. 基于Laravel开发的Diy手机壳在线定制系统源码
  16. libtorch opecv c++ cmake clion
  17. 中式红木装修,古雅灵动、温婉雅致、独具风情
  18. 163,搜狐,新浪哪个邮箱安全?
  19. 计算机的基础配置,教你认知电脑基本配置
  20. 计算机和hdmi无法正常显示,电脑使用HDMI接口接显示器 显示不正常甚至黑屏无法显示怎么办...

热门文章

  1. 小白Java学习之路(abstract抽象类,final,接口,equals)
  2. PHP+Mysql制作一个学生成绩查询模块
  3. 3.JAVAEE-电子商城-用户管理模块
  4. 《SteamVR2.2.0官方教程(二)》(Yanlz+Unity+XR+VR+AR+MR+SteamVR+Valve+Tutorials+Interaction+Oculus+立钻哥哥++ok++)
  5. 面经(各种面试内容)
  6. Altium Designer导入Allegro17.4 PCB文件
  7. python 角度传感器模拟_Arduino300度模拟旋转角度传感器
  8. GAMES101作业1-VS2019
  9. Python3.6 安装PIL
  10. python批量识别二维码图片_python批量操作生成二维码