Spring-白话事物
什么是事物,把一组逻辑放在一起作为一个单元来提交执行,这就是事物,这不是定义,大概是这么个意思
如果你留心的话,你会看到到处都有事物,到处都会提到ACID四个特性(原子性,一致性,隔离性,持久性)
Redis的设计,Mysql的设计,Spring的设计,许许多多都有,并且也都是围绕着这4个特性展开,简单看下:
原子性(atomicity):要么一起成功,要么一起失败,通俗点你可以把他们看成一句代码在执行。。
一致性(consistency):执行前后数据的完整性保持一致
隔离性(isolation):正在执行的这个事物不会受到隔壁事物的干扰
持久性(durability):事物结束,数据就持久到数据库
以上Redis和Mysql的InnoDB存储引擎完美的支持事物(但是注意Mysql的Myisam引擎是不支持的,Redis支持事物,
但并不支持回滚)
由于Spring的事物支持和Mysql息息相关,下面我们关注下Mysql事物的几种隔离级别:
我们先来一个RR,这是使用最多的,也是Mysql的默认设置,RR就是Repeatable Read,可重复读,也就是多次读取结果
一致,什么情况会不一致呢,read uncommitted,望文生义就是读到未提交的,也就是脏读(程序中的说法),Mysql叫
未提交读,什么时候会出现脏读?现在开发一般很少出现,但是,但是,笔者曾经制造过一次,很久才反应过来,这真的
是人为制造的,那个需求是更新同一条记录的count字段+1造成的,这个接口的逻辑有点长,先select读取这条记录,一系
列的判断后决定是否update count加1,最终在某些情况下造成了一个死锁。测试并发情况下还是必现的。有兴趣的可以打开
两个mysql命令行窗口模拟下,首先将autocommited设置为0,不自动提交事务,然后窗口1下执行select记录A,窗口2下执行
select记录A,窗口1接着执行update A,窗口B执行update A,这个时候很关键了,窗口1事物commit,窗口2事物commit
接着你会收到一个超时的死锁提示,这个不细讲了。这里其实出现了一个问题,窗口2的select应该在窗口1update执行完毕之
后才能执行,这才能保证读到的数据不是在脏数据。至于read commited,提交读,很明显,可以避免脏读,但是接着再重复读
的话和先前的结果就不一致了,所以无法避免重复读的问题,最后一个serializable最霸气,序列化,大家谁也别抢,谁也别争
一个个来,解决了脏读,重复读等一系列问题,它叫序列化,和很多设计一样,优势带来的必然就有劣势,这个劣势很明显,
看名字序列化,效率很低下。
白话了这么多,首先告诉你,Spring的默认事物隔离级别跟数据库是保持一致的。接着看
在Spring中如果不考虑隔离级别,我们可能遇到下面几种情况
读到另一事物未提交的数据
读到另一事物已提交的insert的数据,导致多次查询结果不一致
读到另一事务已经提交的 update 的数据导致多次查询结果不一致
我们分别叫他们脏读,幻读,不可重复读
为了解决读这个问题,Spring设置了5种事物隔离级别
对了你没看错,上面那一长段介绍的mysql的4种情况,加上一个默认情况(数据库默认隔离级别),对应的参数名就是isolation
对应可取参数值为TransactionDefinition.ISOLATION_DEFAULT,TransactionDefinition.ISOLATION_REPEATABLE_READ,其他
的几个参数值类似,不再列举
最后我们看下7种传播行为
事物的传播行为描述的是当某一个事务传播行为修饰的方法被嵌套进另一个方法的时事务如何传播。
给一个直观的代码片段:
public void methodA(){
methodB();
//doSomething
}
@Transaction(Propagation=XXX)
public void methodB(){
//doSomething
}
传播行为在事物中占比较重的地位,主要是定义了外围方法在开启事物和未开启事务2种情况下嵌套内
部事物时,关于异常回滚的规则,因此笔者准备开一篇新的随笔贴出实践的代码和分析结果,这里在分
析业务的时候一定注意这么几点:
1、谁调用谁?比如方法a()中调用方法b()
2、a是否在一个开启的事物中
3、a和b抛出异常时,业务要求如何回滚?
4、按照Spring的事物传播行为来配置,测试是否满足对应业务场景
Spring-白话事物的更多相关文章
- spring的事物实现
Spring的事物主要有三个接口 PlatformTransactionManager. 根据TransactionDefinition配置的事物信息创建事物 TransactionDefinitio ...
- Spring定义事物通知tx:advice
<aop:config proxy-target-class="false"> <aop:advisor advice-ref="txAdvice ...
- Spring管理事物两种方式
Spring管理事物两种方式 1. 编程式事物管理(在开发中不经常使用) 使用步骤 1. 配置数据库事物管理 DataSourceTransactionManager <!--配置事物管理器-- ...
- Spring @Transactional事物配置无效原因
spring @transaction不起作用,Spring事物注意事项 1. 在需要事务管理的地方加@Transactional 注解.@Transactional 注解可以被应用于接口定义和接口方 ...
- 第6章 Spring的事物处理
一.简述事物处理 1.事物处理的基本概念 1)提交:所有操作步骤都被完整执行后,称该事物被提交 2)回滚:某步操作执行失败,所有操作都没被提交,则事物必须被回滚 2.事物处理的特性(ACID) 1)原 ...
- 解惑spring嵌套事物
工作中一直对spring中的事物管理都是最简单的配置 但是spring中的事物传播性配置 还有很多种,有时候经常疑惑service调用service的问题,今天的论坛上看到一篇写的非常详细的文字.记录 ...
- [原创]java WEB学习笔记109:Spring学习---spring中事物管理
博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好 ...
- SSM-Spring-21:Spring中事物的使用案例
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 股票买卖案例(我会用三种开启事物的方法 代理工厂bean版的,注解版的,aspectj xml版的) 简单的介 ...
- 转:Spring中事物管理
1.什么是事务? 事务是逻辑上的一组操作,这组操作要么全部成功,要么全部失败 2.事物具有四大特性ACID 说到事务,就不得不说其4大特性,主要如下 原子性:(atomicity) 原子性指的是事务是 ...
- Spring的事物传播行为
事物的传播属性:当事务方法被另一个事务方法调用时, 必须指定事务应该如何传播. 例如: 方法可能继续在现有事务中运行(REQUIRED), 也可能开启一个新事务, 并在自己的事务中运行(Require ...
随机推荐
- 数据库MySQL--常见函数
例子文件:https://files.cnblogs.com/files/Vera-y/myemployees.zip 函数:将一组逻辑语句封装在函数体中,对外暴露函数名 调用:select 函数名( ...
- sql (6) exists
SQL中EXISTS的用法 查询所有选修了1号课程的学生的姓名,年龄,性别首先取Student表中的一个元组,然后在SC表中依次找SC.Sno=该元组的So,并且对应的Cno='2',如果存在,则外层 ...
- Sqlite多线程相关整理
Sqlite多线程相关整理 Sqlite With MultiThreads 什么是线程安全? 当多个线程访问某个方法时,不管你通过怎样的调用方式.或者说这些线程如何交替地执行,我们在主程序中不需要去 ...
- Java 基础 - 比较方式选择(什么类型用equals()比较,什么类型用==比较)
ref: https://www.cnblogs.com/lori/p/8308671.html 在 java 中进行比较,我们需要根据比较的类型来选择合适的比较方式: 对象域,使用 equals 方 ...
- CSS3——伸缩布局及应用
CSS3在布局方面做了非常大的改进,使得我们对块级元素的布局排列变得十分灵活,适应性非常强,其强大的伸缩性,在响应式开中可以发挥极大的作用. 主轴:Flex容器的主轴主要用来配置Flex项目,默认是水 ...
- python相关软件安装流程图解——虚拟机安装——CentOS-7-x86_64-DVD-1810——CentOS-01下载——CentOS-02安装——CentOS-03配置操作
http://www.xitongzhijia.net/soft/24315.html http://www.downxia.com/downinfo/4574.html .
- js 自适应容器宽高
var echartsWarp= document.getElementById('echartsWarp'); var resizeWorldMapContainer = function () { ...
- jquery学习笔记(二):DOM元素操作
内容来自[汇智网]jquery学习课程 2.1 元素属性操作 1.获取元素的属性 语法:attr(name) 参数name表示属性的名称 2.设置元素的属性 单个属性设置语法:attr(key,val ...
- Mac+VS Code+Git+Github
https://blog.csdn.net/qq_37747262/article/details/81750417
- char类型在传参时接收不到数据的原因
mybatis的原因!!!!! 数据库这个样子 在postman中调用接口:SQL select * from T_TRAIN_MARSHALLING where TRAIN_NUM is null ...