隔离级别

事物的隔离级别

旧巷老猫 提交于 2020-01-04 01:22:46
事物的含义: 1、原子性(Atomicity) 事务的原子性是指事务中包含的所有操作要么都做,要么都不做,保证数据库是一致的。 例如:A帐户向B帐户划账1000,则先将A减少1000,再将B增加1000, 这两个动作要么都提交,要么都回退,不可能发生一个有效、一个无效的情况。 2、一致性(Consistency) 一致性是指数据库在事务操作前和事务处理后,其中的数据必须都满足业务规则约束。 例如:A、B帐户的总金额在转账前和转帐后必须一致,其中的不一致必须是短暂的,在事务提交前才会出现的。 再如:约定B帐户不能多于1000元,则A转出1000成功,B转入1000失败,最终由原子性得到-整个事务回滚 3、隔离性(Isolation) 隔离性是数据库允许多个并发事务同时对数据进行读写和修改的能力, 隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。 例如:在A、B之间转帐时,C同时向A转帐,若同时进行则A、B之间的一致性不能得到满足。 所以在A、B事务执行过程中,其他事务不能访问(修改)当前相关的数值。 4、持久性(Durability) 持久性表示为:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。 在提交之前如果系统故障,则所有信息全部丢失。提交之后数据存放在磁盘中,是永久性的。 事务隔离级别 事务隔离级别

事务隔离级别小记

对着背影说爱祢 提交于 2020-01-04 01:21:40
事务的四个属性:原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)。 1.原子性(Atomic) 最重要的原则,也是最容易理解的原则。被事务管理的所有方法,要么一起被提交,要么一起回滚。 2.一致性(Consistency) 事务在系统完整性中实施一致性,如果事务成功地完成,那么系统中所有变化将正确地应用,系统处于新有效状态。如果在事务中出现错误,那么系统中的所有变化将自动地回滚,系统返回到原始状态。 3.隔离性(Isolation) 在隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。这种属性有时称为串行化,为了防止事务操作间的混淆,必须串行化或序列化请求,使得在同一时间仅有一个请求用于同一数据。重要的是,在隔离状态执行事务,系统的状态有可能是不一致的,在结束事务前,应确保系统处于一致状态。但是在每个单独的事务中,系统的状态可能会发生变化。如果事务不是在隔离状态运行,它就可能从系统中访问数据,而系统可能处于不一致状态。通过提供事务隔离,可以阻止这类事件的发生。 4.持久性(Durability) 持久性意味着一旦事务执行成功,在系统中产生的所有变化将是永久的

MySQL数据库事务详解

こ雲淡風輕ζ 提交于 2020-01-01 05:30:05
微信公众号【黄小斜】大厂程序员,互联网行业新知,终身学习践行者。关注后回复「Java」、「Python」、「C++」、「大数据」、「机器学习」、「算法」、「AI」、「Android」、「前端」、「iOS」、「考研」、「BAT」、「校招」、「笔试」、「面试」、「面经」、「计算机基础」、「LeetCode」 等关键字可以获取对应的免费学习资料。 ​ 事务的概念 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。 例如:A向B转账100元,对应于如下两条sql语句: update from account set money=money+100 where name='b'; update from account set money=money-100 where name='a'; 1 2 1 2 数据库 默认事务是自动提交的,也就是发一条sql它就执行一条,如果想多条sql放在一个事务中执行,则需要使用如下语句: start transaction … … commit 1 2 3 4 1 2 3 4 数据库开启事务命令: start transaction :开启事务 rollback :回滚事务 commit :提交事务 MySQL数据库中操作事务命令 编写 测试 SQL脚本,如下: /* 创建数据库 */ create database day16

关于幻读

浪尽此生 提交于 2020-01-01 04:18:06
不可重复读 在同一事务中,两次读取同一数据,得到内容不同,侧重点在于数据修改 幻读 同一事务中,用同样的操作读取两次,得到的记录数不相同,幻读的侧重点在于两次读取的纪录数量不一致 不可重复读和幻读在概念上有些交叉,对于不可重复读来说,在同一个事务中,如果读取到的记录数量发生变化,也可以看作是一种不可重复读,同样,对于幻读来说,同一个事务中的读取结果数量一致,但是内容发生了变化,也可以看成是一种不可重复读。 对于mysql,这里讨论一下read committed和repeatable read两个事务隔离级别的不可重复读和幻读: read committed: 在read committed隔离级别下,存在不可重复读和幻读现象。 起两个事务1和2,1采用快照读读取数据,2修改其中一条满足1查询条件的数据并提交,这时1再快照读一次,就会发现2添加的记录,这就是不可重复读。但如果1采用当前读方式读取数据,由于读取数据的时候会给满足条件的数据加锁,因此,事务2无法修改数据内容,如果单纯从数据内容发生变化这个方面来考虑的话,是不会出现不可重复读的问题的。同时,如果考虑到记录数量增减,由于read committed隔离级别并没有gap锁,所以虽然不能修改采用当前读方式锁定的数据,但是可以在查询条件满足的范围内增加新的数据,这也可以看作是一种不可重复读,但显然这种情况划分到幻读更好。

MySQL快速入门(四)

折月煮酒 提交于 2020-01-01 00:16:35
1 事务处理 接下来我会带大家一起来熟悉mysql中的事务处理机制 1.1 事务概述 l 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表 才支持事务 。 l 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。 l 事务用来管理 DDL、DML、DCL操作,比如 insert,update,delete 语句 一般来说,事务必须满足四个条件 1. Atomicity (原子性) 原子性: 构成事务的的所有操作必须是一个逻辑单元,要么全部执行,要么全部不执行。 2. Consistency (稳定性、一致性) 稳定性 (一致性) : 数据库在事务执行前后状态都必须是稳定的。 3. Isolation (隔离性) 隔离性: 事务之间不会相互影响。 4. Durability (可靠性、持久性) 可靠性 (持久性) : 事务执行成功后必须全部写入磁盘 。 1.2 MySQL事务支持 常见的操作有三步 1. BEGIN或START TRANSACTION;显式地开启一个事务; 2. COMMIT;也可以使用COMMIT WORK,不过二者是等价的。COMMIT会提交事务,并使已对数据库进行的所有修改称为永久性的; 3. ROLLBACK;有可以使用ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务

MySQL学习笔记2——事务的隔离级别

…衆ロ難τιáo~ 提交于 2019-12-31 02:12:43
文章目录 一、事务的隔离级别 二、事务隔离的实现 三、幻读 1.幻读是什么 2.幻读有什么问题 3.如何解决幻读 思考题 一、事务的隔离级别 提到事务,你肯定会想到 ACID(Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性),隔离级别就是“隔离性”的具体体现。 当数据库上有多个事务同时执行的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题。 脏读 :当数据库中一个事务A正在修改一个数据但是还未提交或者回滚,另一个事务B 来读取了修改后的内容并且使用了, 之后事务A提交了,此时就引起了脏读。 此情况仅会发生在: 读未提交的的隔离级别. 不可重复读 :在一个事务A中多次操作数据,在事务操作过程中(未最终提交),事务B也才做了处理,并且该值发生了改变,这时候就会导致A在事务操作的时候,发现数据与第一次不一样了。 就是不可重复读。 此情况仅会发生在:读未提交、读提交的隔离级别. 幻读 :事务a 开启, 查询符合条件的数据 ,发现有10条, 准备将这10条记录修改, 此时事务b开启, 插入了一条符合事务a查询条件的记录. 提交事务, 回到事务a, a也提交事务, 当再次查询到时候, 发现修改了11条。感觉发生了幻觉一样. 此为幻读.

理解事务的4种隔离级别

北战南征 提交于 2019-12-30 03:51:10
数据库事务的隔离级别有4种,由低到高分别为Read uncommitted 、Read committed 、Repeatable read 、Serializable 。而且,在事务的 并发 操作中可能会出现脏读,不可重复读,幻读。下面通过事例一一阐述它们的概念与联系。 Read uncommitted 读未提交,顾名思义,就是一个事务可以读取另一个未提交事务的数据。 事例:老板要给程序员发工资,程序员的工资是3.6万/月。但是发工资时老板不小心按错了数字,按成3.9万/月,该钱已经打到程序员的户口,但是事务还没有提交,就在这时,程序员去查看自己这个月的工资,发现比往常多了3千元,以为涨工资了非常高兴。但是老板及时发现了不对,马上回滚差点就提交了的事务,将数字改成3.6万再提交。 分析:实际程序员这个月的工资还是3.6万,但是程序员看到的是3.9万。他看到的是老板还没提交事务时的数据。这就是 脏读 。 那怎么解决脏读呢?Read committed!读提交,能解决脏读问题。 Read committed 读提交,顾名思义,就是一个事务要等另一个事务提交后才能读取数据。 事例:程序员拿着信用卡去享受生活(卡里当然是只有3.6万),当他埋单时(程序员事务开启),收费系统事先检测到他的卡里有3.6万,就在这个时候!!程序员的妻子要把钱全部转出充当家用,并提交。当收费系统准备扣款时

SQL Server事务的隔离级别和锁

落爺英雄遲暮 提交于 2019-12-29 03:03:53
背景 当用户并发尝试访问同一数据的时,SQL Server尝试用锁来隔离不一致的数据和使用隔离级别查询数据时控制一致性(数据该如何读取),说起锁就会联想到事务,事务是一个工作单元,包括查询/更新数据和数据定义。 锁 锁类型 在SQL Server中,根据资源的不同,锁分为以下三种类型: 行锁:是SQL Server中数据级别中粒度最小的锁级别,行锁根据表是否存在聚集索引,分为键值锁和标识锁 页锁:针对某个数据页添加的锁,在T-SQL语句中,使用了页锁就不会在使用相同类型的行锁,反之依然,在对数据页加锁后,无法在对其添加不兼容的锁 表锁:添加表锁则无法添加与其不兼容的页å锁和行锁 锁模式 共享锁(S):发生在数据查找之前,多个事务的共享锁之间可以共存 排他锁(X):发生在数据更新之前,排他锁是一个独占锁,与其他锁都不兼容 更新锁(U):发生在更新语句中,更新锁用来查找数据,当查找的数据不是要更新的数据时转化为S锁,当是要更新的数据时转化为X锁 意向锁:发生在较低粒度级别的资源获取之前,表示对该资源下低粒度的资源添加对应的锁,意向锁有分为:意向共享锁(IS) ,意向排他锁(IX),意向更新锁(IU),共享意向排他锁(SIX),共享意向更新锁(SIU),更新意向排他锁(UIX) 共享锁/排他锁/更新锁一般作用在较低级别上,例如数据行或数据页,意向锁一般作用在较高的级别上,例如数据表或数据

SQL锁机制和事务隔离级别

核能气质少年 提交于 2019-12-29 03:03:30
锁机制 NOLOCK 和 READPAST 的区别。 1. 开启一个事务执行插入数据的操作。 BEGIN TRAN t INSERT INTO Customer SELECT 'a' , 'a' 2. 执行一条查询语句。 SELECT * FROM Customer WITH ( NOLOCK ) 结果中显示 ”a” 和 ”a” 。当 1 中事务回滚后,那么 a 将成为脏数据。 ( 注 :1 中的事务未提交 ) 。 NOLOCK 表明没有对数据表添加共享锁以阻止其它事务对数据表数据的修改。 SELECT * FROM Customer 这条语句将一直死锁,直到排他锁解除或者锁超时为止。 ( 注 : 设置锁超时 SET LOCK_TIMEOUT 1800) SELECT * FROM Customer WITH ( READPAST ) 这条语句将显示 a 未提交前的状态,但不锁定整个表。这个提示指明数据库引擎返回结果时忽略加锁的行或数据页。 3. 执行一条插入语句。 BEGIN TRAN t INSERT INTO Customer SELECT 'b' , 'b' COMMIT TRAN t 这个时候,即使步骤 1 的事务回滚,那么 a 这条数据将丢失,而 b 继续插入数据库中。 NOLOCK 1. 执行如下语句。 BEGIN TRAN ttt SELECT * FROM

mysql事物隔离级别

懵懂的女人 提交于 2019-12-27 01:23:43
第1级别:Read Uncommitted(读取未提交内容) READ_UNCOMMITTED 会出现脏读、不可重复读、幻读 ( 隔离级别最低,并发性能高 ) (1)所有事务都可以看到其他未提交事务的执行结果 (2)本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少 (3)该级别引发的问题是——脏读(Dirty Read):读取到了未提交的数据 第2级别:Read Committed(读取提交内容) 会出现不可重复读、幻读问题(锁定正在读取的行) (1)这是大多数数据库系统的默认隔离级别(但不是MySQL默认的) (2)它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变 (3)这种隔离级别出现的问题是——不可重复读(Nonrepeatable Read):不可重复读意味着我们在同一个事务中执行完全相同的select语句时可能看到不一样的结果。 第3级别:Repeatable Read(可重读) REPEATABLE_READ 会出幻读(锁定所读取的所有行) (1)这是MySQL的默认事务隔离级别 (2)它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行 (3)此级别可能出现的问题——幻读(Phantom Read):当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行 (4