`
小张三
  • 浏览: 67831 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

数据库隔离级别和锁实现机制(转载)

SQL 
阅读更多

ACID,指数据库的 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库系统,必需要具有这四种特性,否则在事务过程(Transaction processing)当中,无法保证数据的正确性。

一 数据库事务处理中出现的数据不一致的情况

在多个事务并发做数据库操作的时候,如果没有有效的避免机制,就会出现种种问题。大体上有四种问题,归结如下:
1、丢失更新
如果两个事务都要更新数据库一个字段X,x=100
事务A             事务B
读取X=100    
                  读取X=100
写入x=X+100
                  写入x=X+200
事务结束x=200
                  事务结束x=300


最后x==300
这种情况事务A的更新就被覆盖掉了、丢失了。
丢失更新说明事务进行数据库写操作的时候可能会出现的问题。

2、脏读(未提交读)
防止一个事务读到另一个事务还没有提交的记录。
如:
事务A             事务B
                  读取X=100
                  写入x=X+100
读取X=200    
                  事务回滚x=100
读取X=100    
事务结束x=100

事务读取了未提交的数据


3、不可重复读
一个事务在自己没有更新数据库数据的情况,同一个查询操作执行两次或多次的结果应该是一致的;如果不一致,就说明为不可重复读。
还是用上面的例子
事务A             事务B
读取X=100    
                  读取X=100
读取X=100    
                  写入x=X+100
读取X=200    
事务结束x=200
                  事务结束x=200
这种情况事务A多次读取x的结果出现了不一致,即为不可重复读。
4 虚读(Phantom Read)

  事务A读的时候读出了15条记录,事务B在事务A执行的过程中删除(增加)了1条,事务A再读的时候就变成了14(16)条,这种情况就叫做幻影读。
不可重复读说明了做数据库读操作的时候可能会出现的问题。

 

二 数据库事务隔离级别

    为了避免数据库事务操作中的问题,在标准SQL规范中,定义了4个事务隔离级别,不同的隔离级别对事务的处理不同:

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

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

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

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

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

事例:

 

二 事务隔离级别通过锁的实现机制

两个锁:

x锁 排他锁 被加锁的对象只能被持有锁的事务读取和修改,其他事务无法在该对象上加其他锁,也不能读取和修改该对象
s锁 共享锁 被加锁的对象可以被持锁事务读取,但是不能被修改,其他事务也可以在上面再加s锁。

 

在运用X锁和S锁对数据对象加锁时,还需要约定一些规则 ,例如何时申请X锁或S锁、持锁时间、何时释放等。称这些规则为封锁协议(Locking Protocol)。对封锁方式规定不同的规则,就形成了各种不同的封锁协议。
  
  一、一级封锁协议 (对应 read uncommited)  
   一级封锁协议是:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。事务结束包括正常结束(COMMIT)和非正常结束(ROLLBACK)。
   一级封锁协议可以防止丢失修改,并保证事务T是可恢复的。使用一级封锁协议可以解决丢失修改问题。   
   在一级封锁协议中,如果仅仅是读数据不对其进行修改,是不需要加锁的,它不能保证可重复读和不读“脏”数据。
  
  二、二级封锁协议 (对应read commited) 
   二级封锁协议是:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后方可释放S锁 
   二级封锁协议除防止了丢失修改,还可以进一步防止读“脏”数据。但在二级封锁协议中,由于读完数据后即可释放S锁,所以它不能保证可重复读。
  
  三、三级封锁协议 (对应reapetable read )
   三级封锁协议是:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。  
   三级封锁协议除防止了丢失修改和不读“脏”数据外,还进一步防止了不可重复读。

分享到:
评论

相关推荐

    数据库事务和隔离级别

    数据库事务和隔离级别

    深入理解Mysql事务隔离级别与锁机制.pdf

    "深入理解Mysql事务隔离级别与锁机制" 事务隔离级别是数据库系统中的一种机制,...在实际应用中,选择合适的事务隔离级别和锁机制非常重要,需要根据具体的应用场景来选择合适的机制,以确保数据的一致性和可靠性。

    数据库事务隔离级别

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

    oracle 数据库隔离级别学习

    Oracle 数据库隔离级别是数据库事务处理中的核心概念,它决定了事务在并发环境下如何访问和处理数据,以确保数据的一致性和完整性。隔离级别主要解决的是并发操作中的脏读、不可重复读和幻读问题。 脏读(Dirty ...

    四种隔离级别与锁

    数据库事务的四种隔离级别的特点描述,他们的使用热度,以及各种锁在隔离级别下的释放时机。

    深入分析MSSQL数据库中事务隔离级别和锁机制

    在MSSQL数据库中,事务隔离级别和锁机制是确保数据一致性、并发性和避免数据冲突的关键要素。事务隔离级别决定了事务在执行时与其他事务的交互方式,而锁机制则是实现这些隔离级别的具体手段。 首先,让我们理解...

    sybase数据库查被锁的表.doc

    Sybase 数据库锁机制和锁表查询 Sybase 数据库锁机制是指数据库管理系统中用于控制并发访问和维护数据一致性的机制。锁机制可以防止多个事务同时访问同一资源,避免数据的不一致和损坏。 在 Sybase 数据库中,锁...

    Hibernate 事物隔离级别 深入探究

    为了确保数据库的可靠性和一致性,Hibernate 提供了四种事务隔离级别,分别是 Serializable、Repeatable Read、Read Committed 和 Read Uncommitted。 一、Serializable 隔离级别 Serializable 隔离级别是最高级别...

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

    ReadView(读视图)机制是实现这一隔离级别核心手段之一。本文将详细解析MySQL RR隔离级别如何基于ReadView机制实现。 1. 事务隔离级别的基本概念 在讨论ReadView之前,我们需要了解事务隔离级别。数据库事务的隔离...

    数据库事务隔离级别的深入解析与代码实现

    数据库事务隔离级别是确保数据一致性和完整性的重要机制。通过合理设置事务隔离级别,可以在保证数据一致性的同时,优化数据库的并发性能。开发者需要根据具体的应用场景和业务需求,选择最合适的事务隔离级别,并在...

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

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

    SQL server锁的机制

    为了优化并发性,SQL Server还使用了诸如死锁检测和死锁恢复的策略,以及行版本控制(Row Versioning)等技术,如快照隔离和读已提交隔离级别,这些在某些场景下可以提高并发性,减少锁竞争。 总之,SQL Server的锁...

    mysql数据库事务隔离级别[参照].pdf

    数据库事务是确保数据库操作一致性的重要机制,特别是在并发环境中。事务隔离级别是数据库系统用来解决并发...因此,在设计和优化数据库时,理解这些隔离级别和其背后的锁机制至关重要,以确保并发场景下的数据一致性。

    数据库进阶,隔离级别.pdf

    数据库事务隔离级别是指在并发环境中,数据库系统对事务的处理规则,以保证事务的原子性、一致性、隔离性和持久性。事务的隔离级别决定了事务之间的相互影响程度。 1. Atomicity(原子性) 事务的原子性是指事务...

    浅析SQL Server的锁机制

    SQL Server的锁机制是数据库管理系统中用于确保数据完整性与一致性的关键机制,尤其是在多用户...开发人员和DBA需要根据具体的应用场景和性能要求,灵活运用各种锁定策略和隔离级别,以实现高效且安全的数据库操作。

    英文文献《共享数据库中的锁粒度和一致性级别》

    《共享数据库中的锁粒度和一致性级别》是数据库领域的经典论文,主要探讨了在数据库系统中如何通过调整锁的粒度和设置不同的隔离级别来平衡数据一致性和性能之间的关系。这篇论文对后来的数据库标准,如ANSI SQL-92...

    MySQL事务隔离级别

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

    数据库锁和索引实验

    通过这次实验,不仅掌握了锁机制的原理和实践,了解了事务隔离级别的应用场景,还深入理解了索引的工作方式及其对查询性能的影响。这对于优化数据库性能和解决并发问题具有重要意义。同时,也让我们明白了在设计...

Global site tag (gtag.js) - Google Analytics