| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> Java--SpringBoot使用@Transactional注解添加事务 -> 正文阅读 |
|
[Java知识库]Java--SpringBoot使用@Transactional注解添加事务 |
一、Java事务1、通常的观念认为,事务仅与数据库相关。 事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性 (isolation)和持久性(durability)的缩写。 事务的原子性:表示事务执行过程中的任何失败都将导致事务所做的任何修改失效。 通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令。更简答的说就是:要么全部执行成功,要么撤销不执行。
2、为什么需要Java事务 事务是为解决数据安全操作提出的,事务控制实际上就是控制数据的安全访问。
二、SpringBoot事务在Spring中,事务有两种实现方式,分别是编程式事务管理和声明式事务管理两种方式。?
三、SpringBoot事务配置使用1、依赖的Jar包 Spring Boot中实现事务没有额外的Jar包,还是基本的数据库访问包,比如
2、配置事务,使用注解 在Mybatis中使用事务,非常简单,只需要在方法上增加注解@Transactional,无需任何配置
@Transactional可以作用于接口、接口方法、类以及类方法上。当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。因此可以在Service层和Controller层使用 虽然 @Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。另外, @Transactional 注解应该只被应用到 public 方法上,这是由 Spring AOP 的本质决定的。如果你在 protected、private 或者默认可见性的方法上使用 @Transactional 注解,这将被忽略,也不会抛出任何异常。 我看网上说还需要导入Spring boot提供的JDBC或JPA依赖,
在 关于事务管理器,不管是JPA还是JDBC等都实现自接口 PlatformTransactionManager 如果你添加的是 spring-boot-starter-jdbc 依赖,框架会默认注入 DataSourceTransactionManager 实例。如果你添加的是 spring-boot-starter-data-jpa 依赖,框架会默认注入 JpaTransactionManager 实例。 我们通过Debug测试,就能知道自动注入的是 PlatformTransactionManager 接口的哪个实现类
注: 博主亲测,现在 版本Springboot确实不需要上述导入包和启动类添加@EnableTransactionManagement注解 传统工程中使用XML配置事务时,需要给DataSourceTransactionManager事务管理器配置数据源DataSource,那么Spring Boot进行自动配置的话, 四、事务注解详解默认遇到throw new RuntimeException(“…”);会回滚? 指定回滚
指定不回滚
如果有事务,那么加入事务,没有的话新建一个(不写的情况下)
容器不为这个方法开启事务
readOnly=true只读,不能更新,删除
设置超时时间
设置数据库隔离级别
五、事务注解 -- @Transactional 使用注意事项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、抛出受查异常XXXException,事务会回滚。 7、抛出运行时异常NullPointerException,事务会回滚。 8、Quartz中,execute直接调用加了?@Transactional方法,可以回滚;间接调用,不会回滚。(即上文3点提到的) 9、异步任务中,execute直接调用加了?@Transactional方法,可以回滚;间接调用,不会回滚。(即上文3点提到的) 10、在action中加上?@Transactional,不会回滚。切记不要在action中加上事务。 11、在service中加上?@Transactional,如果是action直接调该方法,会回滚,如果是间接调,不会回滚。(即上文3提到的) 12、在service中的private加上?@Transactional,事务不会回滚。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 7:43:45- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |