`

隔离级别

 
阅读更多

自从知道事务的隔离级别已经很长时间了,一直处于半理解的状态,这几天看了很多的博客,对隔离级别有了更深的了解,觉得很有必要把自己的理解写下来。
1.首先我们要知道为什么事务要分隔离级别
如果没有隔离级别的话,数据库操作过程中会出现一下状况
更新丢失(Lost update)

两个事务都同时更新一行数据,但是第二个事务却中途失败退出,导致对数据的两个修改都失效了。这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来。

脏读(Dirty Reads)

一个事务开始读取了某行数据,但是另外一个事务已经更新了此数据但没有能够及时提交。这是相当危险的,因为很可能所有的操作都被回滚。

不可重复读(Non-repeatable Reads)

一个事务对同一行数据重复读取两次,但是却得到了不同的结果。它包括以下情况:

(1) 事务T1读取某一数据后,事务T2对其做了修改,当事务T1再次读该数据时得到与前一次不同的值。

(2) 幻读(Phantom Reads):事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者缺少了第一次查询中出现的数据(这里并不要求两次查询的SQL语句相同)。这是因为在两次查询过程中有另外一个事务插入数据造成的。

可能有些人看到这些概念会有似是而非的感觉,为了能让大家更好的理解这些概念,下面我们通过例子说明这几种情况

Create Table Student
(
Name varchar(50),
Age int,
Address varchar(50)
)

Insert into Student values('小明',15,'北京')
Insert into Student values('小王',16,'天津')

a.更新丢失
有两个事务T1 和T2
T1操作为
update student set Age = 16 where name ='小明'
T2操作为
update student set Address = '武汉' where name ='小明'
T1 与T2同是开始,也就是T1和T2这两个事务开始的时候 小明信息为('小明',15,'北京')
T1成功,小明信息更改为 ('小明',16,'北京');
T2失败,事务回滚到操作之前的状态 小明信息变为('小明',15,'北京')
T2的失败造成T1的更新丢失,这就叫做更新丢失,避免更新丢失的方法就是加排他写锁,排他写锁就是当一个事务在编辑这条信息的时候,禁止其他事务进行写操作。
2.脏读
     一个用户对一个资源做了修改,此时另外一个用户正好读取了这条被修改的记录,然后,第一个用户放弃修改,数据回到修改之前,这两个不同的结果就是脏读。 (即B用户读取了一个A用户没有提交事务的数据(rollback transaction),这样读出来的数据是属于脏数据)

下面是简单的例子来实现脏读:
首先T1为
begin tran
update Student set Age = 16 where Name = ‘小明’
waitfor delay '00:00:05' --延迟五秒
rollback tran --回滚事务
事务T2
select * from Student with(nolock) where Name = ‘小明’
-- 加 with(nolock)可以读到未提交的数据,能提高查询性能,但它并不是没有缺点的,作为一个负面影响,nolock查询还可能带来读取“幻影”数据或读取在一个数据库读取事务中可以获得的但在另一个事务中可能被滚回的数据的风险。

先执行T1,一两秒之后执行T2,五秒之后再次执行T2,会发现中间有一个查询结果小明年龄为16,后来因为事务回滚,造成查询结果又变回为15,而年龄为16的这条数据就是脏数据。
3. 不可重复读 :是指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的 修改,那么第一个事务两次读到的的数据可能是不一样的。这样在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。
事务1第一次读小明的年龄为15
事务2更新小明年龄为16
事务1第二次读小明年龄为16
事务1的两次查询不一样
解决办法:如果只有在修改事务完全提交之后才可以读取数据,则可以避免该问题
4. 幻读 : 是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中 的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。
事务1第一次查询学生信息为两条数据
事务2向学生表中插入一条新的信息
事务1第二次查询学生信息是发现多了一条 产生幻读
解决办法:如果在操作事务完成数据处理之前,任何其他事务都不可以添加新数据,则可避免该问题

2. 隔离级别

      ● 未授权读取(读未提交)(Read Uncommitted):允许脏读取,但不允许更新丢失。如果一个事务已经开始写数据,则另外一个数据则不允许同时进行写操作,但允许其他事务读此行数据。该隔离级别可以通过排他写锁实现。

 授权读取(读提交)(Read Committed):允许不可重复读取,但不允许脏读取。这可以通过瞬间共享读锁排他写锁实现。读取数据的事务允许其他事务继续访问该行数据,但是未提交的写事务将会禁止其他事务访问该行。

 可重复读取Repeatable Read):禁止不可重复读取和脏读取,但是有时可能出现幻影数据。这可以通过共享读锁排他写锁实现。读取数据的事务将会禁止写事务(但允许读事务),写事务则禁止任何其他事务。

 序列化Serializable):提供严格的事务隔离。它要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。如果仅仅通过行级锁是无法实现事务序列化的,必须通过其他机制保证新插入的数据不会被刚执行查询操作的事务访问到。

隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。对于多数应用程序,可以优先考虑把数据库系统的隔离级别设为Read Committed,它能够避免脏读取,而且具有较好的并发性能。尽管它会导致不可重复读、虚读和第二类丢失更新这些并发问题,在可能出现这类问题的个别场合,可以由应用程序采用悲观锁或乐观锁来控制。

分享到:
评论

相关推荐

    Hibernate 事物隔离级别 深入探究

    Hibernate 事务隔离级别 深入探究 在 Hibernate 中,事务隔离级别是指数据库系统提供的一种机制,以解决并发事务带来的问题。为了确保数据库的可靠性和一致性,Hibernate 提供了四种事务隔离级别,分别是 ...

    4种隔离级别

    在SQL标准中,定义了四种不同的隔离级别,分别是读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。下面将详细介绍这四种隔离级别的特性和应用场景...

    数据库的隔离级别介绍

    数据库的隔离级别是数据库管理系统(DBMS)在处理并发事务时确保数据一致性的重要机制。它主要解决了并发操作中可能出现的数据不一致性和并发问题,如更新丢失、脏读、不可重复读和虚读。以下是四种标准的事务隔离...

    MySQL事务隔离级别

    MySQL事务隔离级别是数据库管理系统中一个非常重要的概念,它关系到数据的一致性和并发性能。在MySQL中,事务被用于确保数据库操作的原子性、一致性、隔离性和持久性(ACID特性)。事务隔离级别主要涉及四个方面:读...

    MySQL数据库:事务隔离级别.pptx

    事务隔离级别 课程目标 了解 —— 事务隔离级别的概念; 理解 —— 事务隔离的四种级别; 掌握 —— 事务隔离级别的设置; 事务隔离级别 事务隔离:每一个事务都有一个所谓的隔离级,它定义了用户彼此之间隔离和交互...

    MY SQL 事务隔离 查询:默认事务隔离级别

    查询:默认事务隔离级别 mysql> select @@tx_isolation;当前会话的默认事务隔离级别 mysql> select @@session.tx_isolation;当前会话的默认事务隔离级别 mysql> select @@global.tx_isolation;全局的事务隔离级别

    DB2中的四个隔离级别

    DB2 中的四个隔离级别 DB2 支持四种隔离级别,分别是可重复读(Repeatable Read)、读稳定性(Read Stability)、游标稳定性(Cursor Stability)和未落实的读(Uncommitted Read)。每种隔离级别都有其特点和应用...

    ORACLE的隔离级别

    ### ORACLE的隔离级别 #### 一、概念理解 **隔离级别**定义了事务与事务之间的隔离程度。在多用户环境中,多个事务并发执行时,可能会出现一些问题,如更新丢失、脏读、非重复读和幻像读等。为了减少这些问题的...

    GBase 8s隔离级别

    GBase 8s 是一款高性能的关系型数据库管理系统,它提供了多种隔离级别来处理并发事务,以确保数据的一致性和完整性。隔离级别是数据库系统解决并发控制的重要机制,它定义了事务在执行过程中如何与其他事务交互,...

    4种事务的隔离级别

    事务的隔离级别是数据库管理系统确保数据一致性的重要机制,它解决了并发事务执行时可能出现的问题,如读脏、不可重复读和幻读。在SQL92标准中,定义了四种事务隔离级别,分别是读未提交(Read Uncommitted)、读...

    MySQL的四种事务隔离级别

    MySQL数据库管理系统提供了四种事务隔离级别来处理事务并发中可能遇到的问题。事务并发问题通常包括脏读、不可重复读和幻读。 一、事务的基本要素(ACID) 事务具有四个基本要素,即原子性(Atomicity)、一致性...

    事务传播特性&事务隔离级别

    事务传播特性&事务隔离级别 事务传播特性是指在 Java 中,事务的传播行为,即在多个事务之间如何交互和传播。Java 中有七种事务传播特性,分别是: 1. PROPAGATION_REQUIRED:如果存在一个事务,则支持当前事务。...

    SQLSERVER事务隔离级别的实验研究.pdf

    本文档详细探讨了SQL Server中不同事务隔离级别的实验研究,揭示了各隔离级别与锁管理之间的关系,并通过实验验证了不同隔离级别对数据访问和锁定行为的影响。 SQL Server事务隔离级别分为以下四种: 1. 未提交读...

    数据库事务隔离级别

    介绍数据库事务的四种隔离级别,比较不同隔离级别的区别和影响

    spring事务的传播特性和事务隔离级别

    ### Spring事务的传播特性和事务隔离级别 #### 一、Spring事务的传播特性(Propagation) 在Spring框架中,事务管理不仅提供了ACID属性的支持,还引入了事务的传播特性,这些特性决定了当一个方法调用另一个方法时,...

    spring常用数据库事务传播属性和事务隔离级别1

    Spring 框架提供了一套完善的事务管理机制,其中包含了多种事务传播属性和事务隔离级别。这些特性使得在处理数据库操作时,能够更好地控制事务的边界和行为,从而确保数据的一致性和完整性。 首先,我们来看一下...

    SQLserver锁和事务隔离级别的比较与使用

    SQL Server的锁机制和事务隔离级别是数据库管理系统中确保数据一致性、避免并发问题的重要机制。在SQL Server中,锁主要用于控制多个用户同时访问同一数据时的并发操作,而事务隔离级别则是确定在事务中如何处理这些...

    52 MySQL是如何支持4种事务隔离级别的?Spring事务注解是如何设置的?l.pdf

    MySQL 支持四种事务隔离级别:READ UNCOMMITTED(读未提交)、READ COMMITTED(读已提交)、REPEATABLE READ(可重复读)和 SERIALIZABLE(串行化)。每种隔离级别对应不同程度的事务并发问题的防范,其中,MySQL ...

    56 MySQL最牛的RR隔离级别,是如何基于ReadView机制实现的?l.pdf

    MySQL的可重复读(RR)隔离级别是一种重要的事务隔离级别,旨在避免不可重复读和幻读问题,保证事务在并发环境下的一致性。ReadView(读视图)机制是实现这一隔离级别核心手段之一。本文将详细解析MySQL RR隔离级别...

Global site tag (gtag.js) - Google Analytics