| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> Spring的事务控制 -> 正文阅读 |
|
[Java知识库]Spring的事务控制 |
一、声明式事务(1)场景: 在Spring整个Mybatis后,默认是每个sql语句看作一个事务,当我们有业务需要多条sql时我们就需要控制事务了。 (2)原理: 声明式事务是基于AOP实现的。程序员只需要编写调用持久层代码和业务逻辑代码。把开启事务的代码放在前置通知中,把事务回滚和事务提交的代码放在了后置通知中 (3)使用方式: 1.导入spring-tx
2.?在applicationContext.xml中配置三个标签
?(4)使用注解的方式 1.配置注解扫描
2.开启事务注解的支持
3.配置事务管理器类
4.@Transactional //在方法或者类上使用简单注解就可以 二、spring中的软编码(1)在applicationContext.xml中引入配置文件
(2)在applicationContext.xml可以通过${key}的方式获取value,也可以在spring容器中的类中通过@Value("${key}")注解给属性赋value值。 三、事务的隔离级别(1)事务问题多个事务同时操作数据库时,允许多个事务操作的方式就是事务隔离级别。事务隔离级别主要是通过添加锁操作实现的。事务隔离级别主要是解决高并发下脏读、幻读、不可重复读问题的。 脏读: 事务A没有提交事务,事务B读取到事务A未提交的数据,这个过程称为脏读。读取到的数据叫做脏数据。 不可重复读: 当事务A读取到表中一行数据时,同时另一个事务修改这行数据,事务A读取到的数据和表中真实数据不一致。 ? 幻读: 事务A对表做查询全部操作,事务B向表中新增一条数据。事务A查询出来的数据和表中数据不一致,称为幻读。 (2)spring中如何解决我们可以在tx:method或@Transactional中设置属性isolation的值来进行配置,isolation可取值有 DEFAULT: 表示用数据库的隔离级别,MySQL8默认的事务隔离级别 REPEATABLE_READ (select @@transaction_isolation) READ_UNCOMMITTED: 读未提交(脏读,幻读,不可重复读) READ_COMMITTED: 读已提交(幻读,不可重复读) REPEATABLE_READ: 可重复读(幻读) SERIALIZABLE 串行读来通过牺牲性能解决脏读、不可重复度、幻读问题。 三、事务的传播行为(1)问题 在service方法相互调用时,每个方法都是单独的事务,但是我们不希望这样,就研究出了事务的传播行为。 spring默认的事务传播行为:当一个被声明式事务管理的方法,调用另一个声明式事务管理的方法时,如果在调用另一个方法时发现当前已经有事务了,则加入事务,如果没有事务,开启事务。 (2)spring中控制事务的传播行为 可以通过进行配置tx:method或@Transactional中的propagation属性来进行设置,propagation属性的可选值有: REQUIRED:默认值。如果当前有事务则加入到事务中。如果当前没有事务则新增事务。 NEVER:必须在非事务状态下执行,如果当前没有事务,正常执行,如果当前有事务,报错. NESTED:必须在事务状态下执行.如果没有事务,新建事务,如果当前有事务,创建一个嵌套事务,mysql中当父事务回滚时,会自动让子事务也回滚。 REQUIRES_NEW:必须在事务中执行,如果当前没有事务,新建事务,如果当前有事务,把当前事务挂起. 在重新建 个事务。(调用者统一提交回滚) SUPPORTS:如果当前有事务就在事务中执行,如果当前没有事务,就在非事务状态下执行. NOT_SUPPORTED:必须在非事务下执行,如果当前没有事务,正常执行,如果当前有事务,把当前事务挂起. MANDATORY:必须在事务内部执行,如果当前有事务,就在事务中执行,如果没有事务,报错.(可以配置在入口方法) 四、bean的生命周期在这种情况下只会调用类的构造方法进行实例化。可以通过标签的init-method和destory-method自定义初始化和销毁方法。除此以外还可以让类实现各种Aware接口,例如BeanNameAware、BeanFactoryAware、ApplicationContextAware等。也可以通过InitializingBean,DisposableBean实例化Bean和销毁Bean。也可以通过BeanPostProcessor进行增强。但是当前类不能实现这个接口,且不能与BeanFactoryPostProcessor同时存在。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 | -2025/3/10 16:58:17- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |