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 ...
随机推荐
- Leetcode976. Largest Perimeter Triangle三角形的最大周长
给定由一些正数(代表长度)组成的数组 A,返回由其中三个长度组成的.面积不为零的三角形的最大周长. 如果不能形成任何面积不为零的三角形,返回 0. 示例 1: 输入:[2,1,2] 输出:5 示例 2 ...
- 配置文件一web.xml
前言 web.xml中标签的加载顺序:<context-param> > <listener> (spring的相关工作) > filter >servlet ...
- 如何在CRichEditCtrl控件中直接读如RTF格式的文件(这个是通过流的方式来读取文件)
如何在CRichEditCtrl控件中直接读如RTF格式的文件 Inserting an RTF string using StreamIn ------------------------- ...
- python相关软件安装流程图解——Windows下安装Redis以及可视化工具——Redis-x64-3.2.100——redis-desktop-manager-0.9.3.817
https://www.2cto.com/database/201708/666191.html https://github.com/MicrosoftArchive/redis/releases ...
- 运维人员最常用150个linux命令汇总
命令 功能说明 线上查询及帮助命令(2个) man 查看命令帮助,命令的词典,更复杂的还有info,但不常用. help 查看Linux内置命令的帮助,比如cd命令. 文件和目录操作命令(18个) l ...
- [JZOJ 5778] 没有硝烟的战争
思路: 记\(dp[i][j] = 0/1\)来表示第\(i\)个动物报的数字是\(j\),有无必胜策略. 判断有没有转移就可以了. 输出直接对于每一只动物,看\(dp[i][1->k]\)有没 ...
- iserver中的服务数据迁移
今天需要将iserver测试服务器上的空间数据服务(数据源是Oracle Plus)迁移到客户的正式服务器,原想需要很大的工作量,其实是这样简单: 一.保证客户的iserver环境都已安装正确.对于o ...
- Visual Studio上开发Python六大功能
Visual Studio上开发Python六大功能 一.整合 Python 直译器 (Interpreter) & 互动视窗 (Interactive) Visual Studio 高度整合 ...
- 使用docker安装redis
1.安装docker .检查内核版本,必须是3.10及以上 [root@localhost ~]# uname -r .安装docker [root@localhost ~]# yum install ...
- day 66 Django基础之jQuery操作cookie
Django基础之jQuery操作cookie jquery之cookie操作 定义:让网站服务器把少量数据储存到客户端的硬盘或内存,从客户端的硬盘读取数据的一种技术: 下载与引入:jquery. ...