事务隔离级别

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条。感觉发生了幻觉一样. 此为幻读.

一文快速搞懂MySQL InnoDB事务ACID实现原理

半腔热情 提交于 2019-12-30 23:55:16
【51CTO.com原创稿件】说到数据库事务,想到的就是要么都做修改,要么都不做,或者是 ACID 的概念。其实事务的本质就是锁、并发和重做日志的结合体。 这一篇主要讲一下 InnoDB 中的事务到底是如何实现 ACID 的: 原子性(atomicity) 一致性(consistency) 隔离性(isolation) 持久性(durability) 隔离性 隔离性的实现原理就是锁,因而隔离性也可以称为并发控制、锁等。事务的隔离性要求每个读写事务的对象对其他事务的操作对象能互相分离。 再者,比如操作缓冲池中的 LRU 列表,删除,添加、移动 LRU 列表中的元素,为了保证一致性那么就要锁的介入。 InnoDB 使用锁为了支持对共享资源进行并发访问,提供数据的完整性和一致性。 那么到底 InnoDB 支持什么样的锁呢?我们先来看下 InnoDB 的锁的介绍: InnoDB 中的锁 你可能听过各种各样的 InnoDB 的数据库锁,Gap 锁,共享锁,排它锁,读锁,写锁等等。但是 InnoDB 的标准实现的锁只有 2 类,一种是行级锁,一种是意向锁。 InnoDB 实现了如下两种标准的行级锁: 共享锁(读锁 S Lock),允许事务读一行数据。 排它锁(写锁 X Lock),允许事务删除一行数据或者更新一行数据。 行级锁中,除了 S 和 S 兼容,其他都不兼容。 InnoDB

理解事务的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

亚博体育DAO持久化

自古美人都是妖i 提交于 2019-12-28 23:43:19
亚博体育yb9461分析DAO持久化的意思。 2.1.事务 在一个事务方法中,调用了其他事务的方法,此时事务该如何传递,按照什么规则传播. 1.1事务传播规则情况一:需要遵从当前事务 REQUIRED: 必须存在一个事务,如果当前存在一个事务,则加入到该事务中,否则,新建一个事务;(使用比较多) SUPPORTS: 支持当前事务。如果当前存在事务,则使用该事务否则以非事务形式运行; MANDATORY: 必须要存在事务,如果当存在事务,就使用该事务,否则,抛出异常; 1.2事务传播规则情况二:不遵从当前事务 REQUIRES_NEW:不管当前是否存在事务,都会新开启一个事务 必须是一个新的事务;(使用的比较多) NOT_SUPPORTED: 以非事务方式执行,如果当前存在事务,把当前事务暂停; NEVER :不支持事务,如果当前存在事务,抛出一个异常; 1.3事务传播规则情况三:寄生事务(外部事务/内部事务/嵌套事务) HESTED:寄生事务,如果当前存在事务,则在内部事务内执行;如果当前不存在事务则创建一个新的事务; 寄生事务可以通过数据库savePoint (保存点)来实现,寄生事务可以回滚的,但是他的回滚不影响外部事务.但是外部事务的回滚会影响寄生事务. 1.4<tx:method/>元素的属性(要被增强的方法) name:事务管理的方法名称,支持使用通配符方式:

第四章-DML,DDL和DCL语言

时光怂恿深爱的人放手 提交于 2019-12-28 04:03:01
DML语言 数据的插入 单行插入 insert into table1 (列名) values (列值); insert into table1 (列名) set (列值); 多行插入 inset into table1 (列名) values (列值),(列值); 注: 列名和列值的数量要相同而且一 一对应,不能为null的列都要给值 列名可以隐去,这样相当所有列都赋值,如果可以为null要显性给null值,那么可以使用NULL 对于字符好日期型,值要给单引号,数值则不用 数据的修改 单个表 update table1 set 列名a = 列值a,列名b = 列值b where 条件列式; 多表 (一定要连接条件,不然你的条件列式如果只关于一个表只能限制一个表,那么另一个表可能会成为全表修改,如果用and则表示要两个条件成立,会修改) 其实多表修改,其实就相当于先查询再修改,没有连接条件,就不会产生两个表连接的临时表,那么如果对两个表都有条件则找不到数据,不能修改 update table1 as a,table2 as b set a.列名a=列值a1,a.列名b = 列值a2 where 连接条件 and 条件列式 数据的删除 单个表 delete from table where 条件列式 多表 delete a,b from table1 as a,table2 as b

MySQL事务

好久不见. 提交于 2019-12-27 21:21:52
前言: 什么是事务? 事务是程序中一系列严密的操作,所有操作执行必须成功完成,否则在每个操作所做的更改将会被撤销,这也是事务的原子性(要么成功,要么失败)。 MySQL的事务是在存储引擎层实现。 MySQL的事务有ACID A:原子性(atomicity):一个事务必须被视为一个不可分割的单元。 C:一致性(consistency):数据库是从一种状态切换到另一种状态。 I:隔离性(isolation):事务在提交之前,对于其他事务不可见。 D:持久性(durablity):一旦事务提交,所修改的将永久保存到数据库。 1、事务的基本语法 <!--创建表--> mysql> create table bank -> ( -> name varchar(25), -> money float -> ); Query OK, 0 rows affected (0.00 sec) mysql> insert into bank values('lu','1000'),('qi','5000'); <!--插入数据--> Query OK, 2 rows affected (0.00 sec) Records: 2 Duplicates: 0 Warnings: 0 mysql> begin; <!--begin开启事务,start transaction也可开启事务--> Query OK

Ado.net事务

半城伤御伤魂 提交于 2019-12-27 21:19:28
我们可以用SqlConnection.BeginTransaction来使用事务,但我们也可以用TransactionScope来创建事务。SqlConnection.BeginTransaction大家都比较熟悉,这里主要说一下TransactionScope. 1、使用TransactionScope。 TransactionScope事务,称为“本地量级事务”。如果需要会自动升级为完全分布式事务。该类创建一个范围,事务可在其中生存并自动提交或退回事务。代码如下: using System.Transactions; using System.Configuration; using System.Data.SqlClient; /// <summary> /// 使用TransactionScope事务 /// </summary> private void UseTransactionScope() { ConnectionStringSettings cnSetting = ConfigurationManager.ConnectionStrings[ " NorthWindDb " ]; TransactionOptions opt = new TransactionOptions(); opt.IsolationLevel = System.Transactions