Spring事务杂谈
1. 什么是事务
事务就是以一种可控的方式,对资源进行的一组操作,保证了资源在事务前后,始终应处于被期待的正确的状态。比如不会受到宕机等原因的影响。事务本身,具有如下4种属性-ACID。(所以说事务是酸的ww)
原子性(A)
原子性的描述很简单,就是要么都做,要么都别做。比如转账业务,A向B转100元。首先要从A账户扣掉100,再给B的账户加上100,可能中间会出现问题,只扣A的了没给B加上,这时候就需要原子性来保证了。
一致性(C)
一致性的定义好多,我认为一致性主要是事务前后能通过一致性检查。比如转账前AB的钱总数,和转账后AB钱的总数,是不能变的。
隔离性(I)
隔离性主要指定的是事务并发执行时候的一些要求。
首先说下事务在并发条件下存在的问题。
脏读
事务甲读到了事务乙还没提交的修改。假设这个事务乙回滚了,那么事务甲读的就是脏数据,所以叫做脏读。
不可重复读
事务甲做了如下操作,读取A——干点其他事——读取A。这时候,事务乙,悄悄的提交了对A的修改。事务甲发现,两次读到的行不一样啊。因为重复读取时,数据变了,所以叫做不可重复读。
幻读
事务甲做了如下操作,按A条件查询结果集合——干点其他事——按A条件查询结果集合。事务乙,悄悄地在甲干其他事时,插入了一行符合查询条件A的数据。甲发现,第二次怎么比第一次多了一条啊。所以幻读的定义就是,同样一个事务,查询多次结果集合,结果是不同的,称为幻读,因为就像幻觉一样,数据突然变多了或变少了。
那么,如何解决这些问题呢?设计数据库的大佬们通过定义了4种不同的隔离级别,以解决这种问题。
未提交读
一个事务,可以在事务对数据进行更新,在它还没有提交时,另一个事务就可以看到这个数据。
已提交读
一个事务的更新操作,只有在提交后,另一个事务才能读到更新后的数据。这也就是解决了脏读的问题。
可重复读
保证了同一个事务,对同一数据多次查询,结果总是相同的。看名字就知道解决了不可重复读的问题。
可串行化
所有的事物,必须按照一定顺序串行执行。解决了幻读,因为串行了,所以自然所有设计到并发数据不一致的问题就解决了。
MySQL InnoDB的默认级别,是可重复读。因为事务隔离性要求越高,实现时加锁粒度越大,系统并发度越低,所以MySQL采用了可重复读这个级别。
持久性(D)
事务的持久性是说,一旦事务成功提交,更改就要被永远铭记,不能再逆转。
2. 角色与事务
一个事务中,通常会有如下几个参与者。
RM:负责储存管理系统数据库的资源状态
TPM:负责分布式场景(多个RM),情况下的协调工作。
TM:TPM的核心模块,通常采用两阶段提交方法保证分布式事务的执行。
具体如下图所示。
3. Spring事务
Spring事务杂谈的更多相关文章
- spring事务概念理解
1.数据并发问题 脏读 A事务读取B事务尚未提交的更新数据,并在此数据的基础上操作.如果B事务回滚,则A事务读取的数据就是错误的.即读取了脏数据或者错误数据. 不可重复组 A事务先后读取了B事务提交[ ...
- 【Java EE 学习 52】【Spring学习第四天】【Spring与JDBC】【JdbcTemplate创建的三种方式】【Spring事务管理】【事务中使用dbutils则回滚失败!!!??】
一.JDBC编程特点 静态代码+动态变量=JDBC编程. 静态代码:比如所有的数据库连接池 都实现了DataSource接口,都实现了Connection接口. 动态变量:用户名.密码.连接的数据库. ...
- Spring事务
1.@Transactional 只能被应用到public方法上, 对于其它非public的方法,如果标记了@Transactional也不会报错,但方法没有事务功能.@Transactional 的 ...
- spring事务管理器设计思想(二)
上文见<spring事务管理器设计思想(一)> 对于第二个问题,涉及到事务的传播级别,定义如下: PROPAGATION_REQUIRED-- 如果当前没有事务,就新建一个事务.这是最常见 ...
- spring事务管理器设计思想(一)
在最近做的一个项目里面,涉及到多数据源的操作,比较特殊的是,这多个数据库的表结构完全相同,由于我们使用的ibatis框架作为持久化层,为了防止每一个数据源都配置一套规则,所以重新实现了数据源,根据线程 ...
- Spring事务管理的三种方式
一 .第一种:全注解声明式事务 Xml代码 复制代码 收藏代码 .<?xml version="1.0" encoding="UTF-8"?> .& ...
- spring 事务传播特性 和隔离级别
事务的几种传播特性1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务.如果没有事务则开启2. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务 ...
- Spring事务管理
Spring是SSH中的管理员,负责管理其它框架,协调各个部分的工作.今天一起学习一下Spring的事务管理.Spring的事务管理分为声明式跟编程式.声明式就是在Spring的配置文件中进行相关配置 ...
- Spring事务传播属性
Spring 对事务控制的支持统一在 TransactionDefinition 类中描述,该类有以下几个重要的接口方法: int getPropagationBehavior():事务的传播行为 i ...
随机推荐
- ruby变量
Ruby 支持五种类型的变量. 一般小写字母.下划线开头:变量(Variable).局部变量的作用域从 class.module.def 或 do 到相对应的结尾或者从左大括号到右大括号 {}. 当调 ...
- spark使用idea以client模式提交应用到standalone集群
使用idea以client方式提交代码到standalone集群非常简单. 1.首先有一个部署好且已经启动的standalone集群 --------------------------------- ...
- PHP(十)字符串
- (字典树)Revenge of Fibonacci -- HDU -- 4099
链接: http://acm.hdu.edu.cn/showproblem.php?pid=4099 要用c++交哦, G++ MLE 不是很懂,先粘上慢慢学习 代码: #include<std ...
- MFC DestroyWindow[转]
考虑单窗口情况: 假设自己通过new创建了一个窗口对象pWnd,然后pWnd->Create.则销毁窗口的调用次序: 1. 手工调用pWnd->DestroyWindow(): 2. De ...
- sun.misc.BASE64Decoder的风险
问题描述 最近需要使用Base64上传图片,但是返现sun.misc.BASE64Decoder 为已经过期的包,此包为以前sun公司的内部包,可以下载此包,但是不利于现在Maven方式构建,可能会在 ...
- SpringBoot整合mybatis、shiro、redis实现基于数据库的细粒度动态权限管理系统实例
1.前言 本文主要介绍使用SpringBoot与shiro实现基于数据库的细粒度动态权限管理系统实例. 使用技术:SpringBoot.mybatis.shiro.thymeleaf.pagehelp ...
- 18-11-1 Scrum Meeting 4
1.会议照片 2.每人的工作 昨天完成的工作 完成测验页面,完善表单验证 完成制定计划,修改计划 关联单词数据,英语单词数据准备 今日计划工作 英文单词的图片准备 完善测验功能 3.项目燃尽图 前端页 ...
- task4: 结对编程-词频统计[修改版]
问题描述: 读取一个文件,统计其中单词出现次数,并按从高到低的顺序显示,相同顺序的字典序排列. 思路: 基于上次的程序用正则提取出文本里的单词,然后利用字典计数(先get,为null则置1,不为nul ...
- ie11 兼容的问题
碰到一个问题 下拉列表点不了. 测试后,只在ie11下有这个问题. 先是在head 加<meta http-equiv=”X-UA-Compatible” content="IE=8& ...