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 ...
随机推荐
- Basic4android v3.00 发布
这次发布的版本主要是增加了快速debuger. 在运行时,可以在IDE 里面随时修改代码,而不需要重新发布应用. 大大提高了开发效率. Basic4android v3.00 is released. ...
- qmake -Visual Studio
创建 Visual Studio Projiect 文件 开发者使用 Visual Studio 写Qt应用可以使用Qt商业版提供的Visual Studio integration faciliti ...
- 企业搜索引擎开发之连接器connector(二十三)
我们在前面的文章已经看到,ConnectorCoordinatorImpl类也实现了ChangeHandler接口,本文接下来分析实现该接口的作用 class ConnectorCoordinator ...
- Visual Studio Code 基本操作 - Windows 版
1.Install the .NET SDK 2.Create app: dotnet new console -o myApp cd myApp 3.Run your app:dotnet run
- (zxing.net)一维码Code 128的简介、实现与解码
一.简介 一维码Code 128:1981年推出,是一种长度可变.连续性的字母数字条码.与其他一维条码比较起来,相对较为复杂,支持的字元也相对较多,又有不同的编码方式可供交互运用,因此其应用弹性也较大 ...
- C# SM加密
using System; using System.Collections.Generic; using System.Linq; using System.Text; using Org.Boun ...
- WEB文本框提示
<input type="text" placeholder="文本框提示语" name="version_no"/>
- LightOJ 1138 Trailing Zeroes (III)(二分 + 思维)
http://lightoj.com/volume_showproblem.php?problem=1138 Trailing Zeroes (III) Time Limit:2000MS M ...
- 'Install app for SharePoint': Sideloading of apps is not enabled on this site
http://blog.lekman.com/2012/11/sharepoint-2013-sideloading-of-apps-is.html Solution: You need to ena ...
- 1、认识Struts2
先上百度百科的权威说明:一定注意我下面做标记的话: 框架就是一个半成品,就是可以帮我们完成一些业务 1. 什么是Struts2的框架 * Struts2是Struts1的下一代产品,是在 struts ...