`
liuzhiqiang19890403
  • 浏览: 61017 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

数据库锁简单了解

 
阅读更多

共享锁(Shared lock)。 例1:----------------------------------------T1: select * from table (请想象它需要执行1个小时之久,后面的sql语句请都这么想象)T2: update table set column1='hello'过程:T1运行 (加共享锁)T2运行If T1 还没执行完 T2等......else 锁被释放 T2执行endifT2之所以要等,是因为T2在执行update前,试图对table表加一个排他锁,而数据库规定同一资源上不能同时共存共享锁和排他锁。所以T2必须等T1执行完,释放了共享锁,才能加上排他锁,然后才能开始执行update语句。

 

例2:----------------------------------------T1: select * from tableT2: select * from table这里T2不用等待T1执行完,而是可以马上执行。分析:T1运行,则table被加锁,比如叫lockAT2运行,再对table加一个共享锁,比如叫lockB。两个锁是可以同时存在于同一资源上的(比如同一个表上)。这被称为共享锁与共享锁兼容。这意味着共享锁不阻止其它session同时读资源,但阻止其它session update

 

 

例3:----------------------------------------T1: select * from tableT2: select * from tableT3: update table set column1='hello'这次,T2不用等T1运行完就能运行,T3却要等T1和T2都运行完才能运行。因为T3必须等T1和T2的共享锁全部释放才能进行加排他锁然后执行update操作。

 

例4:(死锁的发生)----------------------------------------T1:begin transelect * from table (holdlock) (holdlock意思是加共享锁,直到事物结束才释放)update table set column1='hello'T2:begin transelect * from table(holdlock)update table set column1='world'假设T1和T2同时达到select,T1对table加共享锁,T2也对加共享锁,当T1的select执行完,准备执行update时,根据锁机制,T1的共享锁需要升级到排他锁才能执行接下来的update.在升级排他锁前,必须等table上的其它共享锁释放,但因为holdlock这样的共享锁只有等事务结束后才释放,所以因为T2的共享锁不释放而导致T1等(等T2释放共享锁,自己好升级成排他锁),同理,也因为T1的共享锁不释放而导致T2等。死锁产生了。---------事务未结束不释放锁,互相再等对方释放锁

 

例5-----------------------------更新锁(Update lock) 为解决死锁,引入更新锁。---------------------------------------T1:begin transelect * from table(updlock) (加更新锁)update table set column1='hello'T2:begin transelect * from table(updlock)update table set column1='world'更新锁的意思是:“我现在只想读,你们别人也可以读,但我将来可能会做更新操作,我已经获取了从共享锁(用来读)到排他锁(用来更新)的资格”。一个事物只能有一个更新锁获此资格。T1执行select,加更新锁。T2运行,准备加更新锁,但发现已经有一个更新锁在那儿了,只好等。当后来有user3、user4...需要查询table表中的数据时,并不会因为T1的select在执行就被阻塞,照样能查询

 

 

例6----------------------------------------------------------T1: select * from table(updlock) (加更新锁)T2: select * from table(updlock) (等待,直到T1释放更新锁,因为同一时间不能在同一资源上有两个更新锁)T3: select * from table (加共享锁,但不用等updlock释放,就可以读)这个例子是说明:共享锁和更新锁可以同时在同一个资源上。这被称为共享锁和更新锁是兼容的

 

 

例7----------------------------------------alter table .... (加schema locks,称之为Schema modification (Sch-M) locksDDL语句都会加Sch-M锁该锁不允许任何其它session连接该表。连都连不了这个表了,当然更不用说想对该表执行什么sql语句了。

 

 

在只有单一用户的数据库中,用户可以任意修改数据,而无需考虑同时有其他用户正在修改相同的数据。但在一个多用户数据库中,多个并发事 务中包含的语句可能 会修改相同的数据。数据库中并发执行的事务最终应产生有意义且具备一致性的结果。因此在多用户数据库中,对数据并发访问(data concurrency)及数据一致性(data consistency)进行控制是两项极为重要的工作。

1、数据并发访问指多用户同时访问相同的数据。

2、数据一致性指系统中每个用户都能够取得具备一致性的数据,同时还能够看到自己或其他用户所提交的事务对数据的修改。

 

 

为了描述同时执行的多个事务如何实现数据一致性,数据库研究人员定义了被称为串行化处理(serializability)的事务隔离 模型(transaction isolation model)。当所有事务都采取串行化的模式执行时,我们可以认为同一时间只有一个事务在运行(串行的),而非并发的。

以串行化模式对事务进行隔离的效果很好,但在此种模式下应用程序的效率将大大降低。将并行执行的事务完全隔离意味着即便当前只存在一个 对表进行查询(query)的事务,其他事务也不能再对此表进行插入(insert)操作了。总之,为了满足实际要求,我们需要在事务的隔离程度与应用的 性能之间找出一个平衡点。

 

 

ANSI/ISO SQL 标准(SQL92)定义了四种事务隔离级别(transaction isolation level),这四种隔离级别所能提供的事务处理能力各不相同。这些事务隔离级别是针对三种现象定义的,在并发事务执行时,需要阻止这三种现象 中的一种或多种发生。

 

三种需要阻止的现象(preventable phenomena)是:

1、脏读取(dirty read):一个事务读取了被其他事务写入但还未提交的数据。

2、不可重复读取(nonrepeatable read):一个事务再次读取其之前曾经读取过的数据时,发现数据已被其他已提交的事务修改或删除。

3、不存在读取(phantom read):事务按照之前的条件重新查询时,返回的结果集中包含其他已提交事务插入的满足条件的新数据。

 

oracle中针对管理数据并发访问及数据一致性,使用的多种方式中有一种程序代码可以参考的方式:

多版本并发访问控制

Oracle 能够自动地实现一个查询的读一致性,即一个查询所获得的数据来自同一时间点
在一个查询执行期间,只有在查询执行前提交的数据对此查询才是可见的。查询无法看到其开始执行后提交的数据。
 
Oracle 的串行化隔离适合于具备以下特点的系统:出现修改相同数据的事务的几率较小,且长时间执行的事务以只读操作为主。最适合采用串行化隔离的系统是大型数据库,且其中主要运行更新少量数据的短小事务。
在程序系统的日常操作中假如多数为查询并且更新和删除事务操作量小的话,完全可以使用oracle数据的串行化隔离级别,但是假如更新和删除事务操作量大的话最好还使用其他的事务隔离级别,再者,oracle的串行化隔离级别能够满足上面需求的系统,但是其他的一些数据库就估计够呛了,oracle针对串行化隔离级别做过多的处理。
 
串行化事务隔离级别除外,oracle还提供了其他类型的事务隔离级别:
                                         脏读取       不可重复读取     不存在读取                                                                 未提交读取                       允许              允许                  允许
已提交读取                       不允许              允许               允许
可重复读取                       不允许               不允许           允许
 
 
已提交读取 Oracle 默认使用的事务隔离级别。事务内执行的查询只能看到查询执行前(而非事务开始前)就已经提交的数据。Oracle 的查询永远不会读取脏数据(未提交的数据)。
分享到:
评论

相关推荐

    赋予数据库断点权限以及数据库解锁命令

    ### 数据库断点权限与解锁命令详解 #### 一、背景介绍 ...同时,对于数据库管理员来说,了解这些基本操作也是十分必要的。希望本文能够帮助广大Oracle数据库使用者更好地理解和运用这些实用技巧。

    用数据库中的表锁定和解锁

    首先,我们需要了解什么是表锁定。在数据库系统中,锁定机制是用来控制并发操作,防止多个用户同时修改同一数据,导致数据不一致。表锁定分为多种级别,如共享锁(读锁)允许多个用户读取同一表,但不允许写入;独占...

    数据库的锁.pdf

    数据库锁是一种确保数据库数据一致性和完整性的机制,尤其在多用户同时对数据进行读写操作时,锁能够避免数据访问冲突。锁机制是数据库管理系统(DBMS)中的核心功能之一,它需要高效且复杂地管理并发访问,以避免...

    数据库相关知识了解(一)

    数据库锁有: * 共享锁:锁定数据,防止其他用户写入数据。 * 排他锁:锁定数据,防止其他用户读取或写入数据。 5. 数据库的乐观锁和悲观锁 乐观锁是一种锁机制,用于防止数据冲突的发生。悲观锁是一种锁机制,...

    基于轻量数据挖掘方法的数据库锁表优化研究.pdf

    总结来说,轻量数据挖掘方法在数据库锁表优化方面具有很大的潜力,通过建立神经网络预测器,可以自动调整锁表参数,减少锁冲突,提升系统整体的性能和事务处理能力。未来的研究将聚焦于进一步提高神经网络的性能,...

    国产数据库 达梦数据库管理工具

    1. 数据库管理:工具提供了一键创建、删除和修改数据库实例的功能,使数据库的部署和配置变得更加简单。用户可以轻松管理数据库表、索引、视图和存储过程等对象,同时支持数据的备份与恢复,确保数据的安全性。 2. ...

    C# 数据库系统开发 案例精选 光盘源文件附带sqlserver2005数据库文件

    1. **C#语言基础**:C#是.NET框架的主要编程语言,它的面向对象特性、强大的类型系统和丰富的类库使得开发数据库应用程序变得简单。学习C#的基本语法、类、对象、接口等概念是构建数据库应用的基础。 2. **ADO.NET*...

    数据库质疑的修复

    通过对上述命令的详细了解,我们可以看到,在处理数据库质疑时,有多种策略可供选择,每种策略都有其适用场景。合理地运用这些修复命令,可以有效提高数据库的稳定性和可靠性,减少因数据损坏带来的损失。在实际操作...

    HNU数据库原理数据库设计与应用开发大作业

    了解不同的恢复模型如简单恢复、完全恢复和大容量日志恢复模型也是必要的。 9. 数据库应用开发:这涉及到如何将数据库集成到应用程序中,如使用JDBC、ODBC等接口进行连接,以及ORM(对象关系映射)框架如Hibernate...

    三级数据库各章节要点

    在准备三级数据库考试的过程中,了解并掌握各章节的知识要点至关重要。以下是对这些要点的详细解析,旨在帮助你在学习过程中事半功倍。 1. **数据库系统基础** - 数据库概念:理解数据库、数据库管理系统(DBMS)...

    数据库-课程教学讲义

    通过这份“数据库-课程教学讲义”,学习者不仅能够掌握数据库的基础知识,还能了解到数据库在实际应用中的复杂性和重要性。配合PPT讲义,以图文并茂的方式呈现,更有利于理解和记忆,是自我学习或课堂教学的理想资源...

    全国计算机等级考试-三级数据库技术-电子版

    7. **数据库备份与恢复**:了解备份策略,如全备、增量备和差异备份,以及如何进行数据恢复,包括简单恢复模型、完全恢复模型和大容量日志记录恢复模型。 8. **数据库性能优化**:学习索引的原理和使用,查询优化器...

    数据库课设,期末课设

    了解ACID(原子性、一致性、隔离性和持久性)属性,以及锁机制和乐观并发控制策略。 8. **备份与恢复**:数据库的备份和恢复策略对于防止数据丢失至关重要。了解如何进行完整备份、增量备份和差异备份,以及如何在...

    Java 用于学习简单的数据库中间件

    本项目是一个用Java实现的简单数据库中间件,虽然规模不大,但涵盖了核心功能,非常适合初学者理解和学习。 1. **Java基础** 在了解数据库中间件之前,你需要熟悉Java基础,包括语法、面向对象编程概念(类、对象...

    Sqlite3 C++ 简单单例数据库操作类封装

    总结来说,"Sqlite3 C++ 简单单例数据库操作类封装"是一个实现C++与SQLite3数据库交互的工具,通过单例模式保证了数据库连接的唯一性和高效性。这种封装简化了对SQLite3的使用,让开发者能够更专注于业务逻辑,而...

    E数据库简单例程.rar

    了解事务的ACID属性(原子性、一致性、隔离性和持久性)对理解数据库操作至关重要。 6. **索引和优化**:数据库性能优化是关键部分,例程可能包含如何创建索引以加快查询速度,以及调整数据库配置以提高整体性能的...

    java实现监听数据库源码

    在Java编程中,监听数据库的变化是一项重要的任务,特别是在实时...通过以上分析,我们了解了Java实现数据库监听的多种方式,以及需要注意的关键点。具体实现时,应根据项目需求、数据库类型和性能要求选择合适的方法。

    给数据库连接字符串加把安全锁

    ### 给数据库连接字符串加把安全锁 在开发ASP.NET应用程序的过程中,安全性一直是开发者关注的重点之一。特别是对于数据库连接字符串的处理,不当的管理可能会导致敏感信息泄露,进而造成不可估量的损失。本文旨在...

    数据库习题答案+模拟试题

    - 锁机制:理解共享锁(读锁)和排他锁(写锁),以及行级锁和表级锁的区别。 - 事务:ACID属性(原子性、一致性、隔离性和持久性)及其在并发控制中的作用。 8. **数据库性能优化** - 查询优化:理解查询计划,...

Global site tag (gtag.js) - Google Analytics