事务隔离级别

数据库事务

浪尽此生 提交于 2020-04-06 08:12:13
  事务是一系列操作组成的工作单元,该工作单元内的操作是不可分割的,也就是说要么全部执行,要么全部都不执行。 四大属性 原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。 一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。 隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。 持久性(durability)。持久性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。 隔离级别    默认事务的隔离级别 mysql> SHOW VARIABLES LIKE 'tx_isolation'; 默认为 可重复读 设置当前会话隔离级别 SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE; 本文索引关键字: 原子性(atomicity):http://www.cnblogs.com/huanStephen/p/8075938.html#atomicity 一致性(consistency):http://www.cnblogs

简说Spring的事务机制和Spring是如何管理事务的

人盡茶涼 提交于 2020-04-06 05:30:47
事务管理可以帮助我们保证数据的一致性 一 Spring事务机制 编程式事务管理 : Spring推荐使用TransactionTemplate,但是实际开发时我们使用 较多的还是声明式事务较多. 声明式事务管理 : 将我们从复杂的业务管理中解脱出来,获取连接、关闭连接、事务提交、回滚、 异常处理等这些操作都不用我们处理了,Spring都会帮我们处理. 声明式事务管理我们使用了AOP面向切面编程实现,本质上就是我们在目标方法执行前后进行 拦截,在目标方法执行前加入或创建一个事务,在执行方法执行后,根据实际情况选择提交或回滚事务,从而 达到增强方法的目的. 二 Spring是如何来管理事务的? 首先我们要知道Spring事务管理主要包括3个接口,Spring的事务主要是由他们三个共同完成的. 1)PlatformTransactionmanger :事务管理器 主要是用于平台相关事务的管理 主要有3个方法 : 1. commit 提交 : 用来提交我们的事务 2. rollback 回滚 : 当事务出错时可以进行回滚 3.getTransaction : 获取事务的状态 2)TransactionDefinition:事务定义信息--用来定义事务相关的属性,给事务管理器PlatformTransactionManager使用 这个接口有下面四个主要方法:

使用Spring管理数据库事务

守給你的承諾、 提交于 2020-04-06 03:31:10
在整个JavaWeb项目开发中,事务是用来开发可靠性网络应用程序的最关键部分。当应用程序与后端资源进行交互时,就会用到事务,这里的后端资源包括数据库、MQ、ERP等。而数据库事务是最常见的类型,而我们常说的事务也就是狭义上的与关系型数据库交互的事务。 事务主要分为本地事务和全局事务。全局事务又称分布式事务,本地事务就是当应用程序连接单个数据库资源时的事务,也是本文化主要讨论的内容。 一、事务的一些基本概念 事务的属性(ACID): 原子性 一致性 隔离性 持久性 白话“事务” 事务有三个状态(或者说是过程): 开始、提交、回滚 。 假设有这么一个场景:张三和李四各有100元,有一天,张三要给李四转10元。 相当于目前的微信转账,张三给李四发了10元的转账。有以下三种状态 上边这个例子有一处不恰当的地方就是,就算李四没有操作这10元时,张三已经少了10元,这一点和事务有出入 ,我们就假装如果李四不接收或者退回这10元,张三的微信钱包里还有100元。但是在微信中有那么多的人相互转账,每一次转账就是一个事务,我们就要把这些事务进行隔离,但是它有不同的隔离级别(见下) 事务的隔离级别 隔离级别 描述 举例 DEFAULT 底层数据库存储的默认隔离级别 READ_UNCOMMITTED 最低的隔离级别,可以说它并不是事务,因为它允许其他事务来读取未来提交的数据 上边的例子中

数据库隔离级别

陌路散爱 提交于 2020-04-05 23:12:08
数据库隔离级别 如果没有隔离级别会出现的问题 脏读 意思是读取到了事务正在修改的数据,如果事务回滚,那么拿到的数据就是错误的 时间 事务A 事务B 1 开始事务 2 读取quantity为5 3 修改quantity为4 4 开始事务 5 读取到quantity为4 6 发生错误,回滚,quantity为5 7 提交事务 在按照正常逻辑quantity应该为5 不可重复读 时间 事务A 事务B 1 开始事务 2 读取quantity为5 3 开始事务 4 修改quantity为4 5 提交事务 6 读取quantity为4 7 提交事务 在同一个事务内,两次读取同一个数据产生不一致 幻读 时间 事务A 事务B 1 开始事务 2 更新所有行的quantity为100 3 开始事务 4 插入一行quantity为5 5 提交事务 6 查询所有行的quantity 7 提交事务 当一个事务内更新所有行后,另一个事务插入了新行,当再次查看记录时,发现有未更新的记录,好像幻觉一样 丢失更新 第一种情况: 时间 事务A 事务B 1 开始事务 2 查询到quantity为10 3 开始事务 4 查询到quantity为10 5 更新quantity为11 6 提交事务 7 更新quantity为9 8 事务回滚,quantity为10 可以看到,回滚的事务把正常事务的数据覆盖了

MySQL事务隔离性

好久不见. 提交于 2020-04-05 19:23:31
事务隔离性 当多个线程都开启事务操作数据库中数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性。 如果没有隔离,会发生的几种问题 脏读(Dirty Read) 一个事务处理过程里读取了另一个未提交的事务中的数据 不可重复读(NonRepeatable Read) 对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询的间隔期间,另外一个事务修改并提交了该数据。 不可重复读和脏读的区别是,脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据。 在某些情况下,不可重复读并不是问题,比如我们多次查询某个数据当然以最后查询得到的结果为主。但在另一些情况下就有可能发生问题,例如对于同一个数据A和B依次查询就可能不同,A和B就可能打起来了……。 幻读(Phantom Read) 在一个事务中读取到了别的事务插入的数据,导致前后不一致。 事务A 按照一定条件进行数据读取,期间事务B插入了相同搜索条件的新数据,事务A再次按照原先条件进行读取时,发现了事务B 新插入的数据。 不同隔离级别的问题 MySQL的锁类型 表锁 对一整张表加锁,并发能力低下(即使有分读锁、写锁),一般在DDL处理时使用,myisam也是表锁。 行锁 只锁住特定行的数据,并发能力强,MySQL一般都是用行锁来处理并发事务。 如果用到无索引的字段

分布式事务浅析及简单实现

旧时模样 提交于 2020-04-05 16:31:18
作者:翟飞 在分布式系统中,为了保证数据的高可用,通常,我们会将数据保留多个副本(replica),这些副本会放置在不同的物理的机器上。为了对用户提供正确的 CRUD 等语义,我们需要保证这些放置在不同物理机器上的副本是一致的。分布式事务在现在遍地都是分布式部署的系统中几乎是必要的。 我们先聊一下啥是事务? 分布式事务、事务隔离级别、ACID我相信大家这些东西都耳熟能详了,那什么是事务呢? 概念: 一般是指要做的或所做的事情。 指作为单个逻辑工作单元执行的一系列操作,要么全部执行,要么全部不执行。 简单的说,事务就是并发控制的单位,是用户定义的一个操作序列。 特性: 事务是恢复和并发控制的基本单位。 事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。 原子性(atomicity):一个事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做。 一致性(consistency):事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。 隔离性(isolation):一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。 持久性(durability):持久性也称永久性(permanence),指一个事务一旦提交

事务隔离级别,为什么SQLSERVER 容易锁表

旧时模样 提交于 2020-04-04 10:22:57
在Oracle中,读取操作不会阻碍更新操作,更新操作也不会阻碍读取操作,这样在Oracle中的各种隔离级别下,读取操作都不会等待更新事务结束,更新操作也不会因为另一个事务中的读取操作而发生等待,这也是Oracle事务处理的一个优势所在。 oracle支持Read Committed和Serializable级别,默认的隔离级别是Read committed,在oracle中隔离级别实现如下: Read Committed隔离级别(也称为语句级别的隔离) 如果一个事务正在对某个表进行DML操作,而这时另外一个会话对这个表的记录进 行读取操作,则Oracle会去读取回滚段或撤销段中存放的更新之前的记录,而不会象SQL Server一样等待更新事务的结束。 Serializable隔离级别(也称为事务级别的隔离) 事务中的读取操作只能读取这个事务开始之前已经提交的数据结果。如果在读取时, 其他事务正在对记录进行修改,则Oracle就会在回滚段或撤销段中去寻找对应的原来未经更改的记录(而且是在读取操作所在的事务开始之前存放于回滚段或 撤销段的记录),这时读取操作也不会因为相应记录被更新而等待。 ———————————————— 版权声明:本文为CSDN博主「ClementQL」的原创文章,遵循 CC 4.0 BY-NC-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https

sql server 数据库事务隔离级别

假如想象 提交于 2020-04-04 04:33:17
SQL SERVER锁的机制 SQL server的所有活动都会产生锁。锁定的单元越小,就越能越能提高并发处理能力,但是管理锁的开销越大。如何找到平衡点,使并发性和性能都可接受是SQL Server的难点。 SQL Server有如下几种琐: 1、 共享锁 用于只读操作(SELECT),锁定共享的资源。共享锁不会阻止其他用户读,但是阻止其他的用户写和修改。 2、 更新锁 更新锁是一种意图锁,当一个事务已经请求共享琐后并试图请求一个独占锁的时候发生更新琐。例如当两个事务在几行数据行上都使用了共享锁,并同时试图获取独占锁以执行更新操作时,就发生了死锁:都在等待对方释放共享锁而实现独占锁。更新锁的目的是只让一个事务获得更新锁,防止这种情况的发生。 3、 独占锁 一次只能有一个独占锁用在一个资源上,并且阻止其他所有的锁包括共享缩。写是独占锁,可以有效的防止’脏读’。 4、 意图缩 在使用共享锁和独占锁之前,使用意图锁。从表的层次上查看意图锁,以判断事务能否获得共享锁和独占锁,提高了系统的性能,不需从页或者行上检查。 5、 计划锁 Sch-M,Sch-S。对数据库结构改变时用Sch-M,对查询进行编译时用Sch-S。这两种锁不会阻塞任何事务锁,包括独占锁。 读是共享锁,写是排他锁,先读后更新的操作是更新锁,更新锁成功并且改变了数据时更新锁升级到排他锁。锁的类型有: DB-----数据库,由于

MySQL 21道高频面试题及其解析

人盡茶涼 提交于 2020-04-03 23:52:04
Q1:MySQL主要有哪些存储引擎,分别适合哪些应用场景? 答:主要有①MyISAM,是5.5版本之前的默认存储引擎,支持表级锁,不支持事务和外键,并发效率较低,读取数据快,更新数据慢。适合以读操作为主,并且对并发性要求较低的应用。②InnoDB,MySQL目前的默认存储引擎,支持行级锁、事务和外键,并发效率好。适合对事务的完整性和并发性、数据的准确性要求比较高,增删操作多的应用。③Memory,所有的数据都保存在内存中,访问速度快,一旦服务关闭数据将丢失。适合更新不太频繁的数据量小的表用来快速得到访问结果。④Archive、Federated等。 Q2:索引是什么? 答:MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。 Q3:索引的优缺点有哪些? 答:①优势:提高数据检索的效率,降低数据库的IO成本。通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗。②劣势:实际上索引也是一张表,该表中保存了主键与索引字段,并指向实体类的记录,所以索引列也是要占用空间的。 虽然索引大大提高了查询效率,同时却也降低更新表的速度,如对表进行INSERT、UPDATE

30.6. MySQL并发控制,加锁和事务,隔离级别,日志等

点点圈 提交于 2020-04-02 12:12:18
并发控制 锁粒度: 表级锁 行级锁 锁: 读锁:共享锁,只读不可写(包括 自己当前用户 和当前事务) ,多个读互不阻塞 写锁:独占锁,排它锁,写锁会阻塞其它事务(不包括当前事务)的读和它锁 实现 存储引擎:自行实现其锁策略和锁粒度 服务器级:实现了锁,表级锁,用户可显式请求 分类: 隐式锁:由存储引擎自动施加锁 显式锁:用户手动请求 锁策略:在锁粒度及数据安全性寻求的平衡机制 显式使用锁 LOCK TABLES 加锁 lock tables tbl_name [[AS] alias] lock_type [, tbl_name [[AS] alias] lock_type] ... lock_type: READ ,WRITE UNLOCK TABLES 解锁 FLUSH TABLES [tb_name[,...]] [WITH READ LOCK] 关闭所有正在打开的表,同时清除掉查询缓存以及准备好的语句缓存, 如果加上with read lock 选项的话,它代表关闭所有正在打开的表并加上全局锁(不清除缓存了), 通常在备份前加全局读锁 SELECT clause [FOR UPDATE | LOCK IN SHARE MODE] 查询时加写或读锁 注意点1(加锁): 注意,读锁加到表上之后,此表将只能读,不能进行其他任何操作。