转载:
数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。
加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。
在数据库中有两种基本的锁类型:排它锁(Exclusive Locks,即X锁)和共享锁(Share Locks,即S锁)。当数据对象被加上排它锁时,其他的事务不能对它读取和修改。加了共享锁的数据对象可以被其他事务读取,但不能修改。数据库利用这两种基本的锁类型来对数据库的事务进行并发控制。
Oracle数据库的锁类型
根据保护的对象不同,Oracle数据库锁可以分为以下几大类:DML锁(data locks,数据锁),用于保护数据的完整性;DDL锁(dictionary locks,字典锁),用于保护数据库对象的结构,如表、索引等的结构定义;内部锁和闩(internal locks and latches),保护 数据库的内部结构。
DML锁的目的在于保证并发情况下的数据完整性,。在Oracle数据库中,DML锁主要包括TM锁和TX锁,其中TM锁称为表级锁,TX锁称为事务锁或行级锁。
当Oracle 执行DML语句时,系统自动在所要操作的表上申请TM类型的锁。当TM锁获得后,系统再自动申请TX类型的锁,并将实际锁定的数据行的锁标志位进行置位。这样在事务加锁前检查TX锁相容性时就不用再逐行检查锁标志,而只需检查TM锁模式的相容性即可,大大提高了系统的效率。TM锁包括了SS、SX、S、X 等多种模式,在数据库中用0-6来表示。不同的SQL操作产生不同类型的TM锁。
在数据行上只有X锁(排他锁)。在 Oracle数据库中,当一个事务首次发起一个DML语句时就获得一个TX锁,该锁保持到事务被提交或回滚。当两个或多个会话在表的同一条记录上执行 DML语句时,第一个会话在该条记录上加锁,其他的会话处于等待状态。当第一个会话提交后,TX锁被释放,其他会话才可以加锁。
当Oracle数据库发生TX锁等待时,如果不及时处理常常会引起Oracle数据库挂起,或导致死锁的发生,产生ORA-60的错误。这些现象都会对实际应用产生极大的危害,如长时间未响应,大量事务失败等。
悲观封锁和乐观封锁
一、悲观封锁
锁在用户修改之前就发挥作用:
Select ..for update(nowait)
Select * from tab1 for update
用户发出这条命令之后,oracle将会对返回集中的数据建立行级封锁,以防止其他用户的修改。
如果此时其他用户对上面返回结果集的数据进行dml或ddl操作都会返回一个错误信息或发生阻塞。
1:对返回结果集进行update或delete操作会发生阻塞。
2:对该表进行ddl操作将会报:Ora-00054:resource busy and acquire with nowait specified.
原因分析
此时Oracle已经对返回的结果集上加了排它的行级锁,所有其他对这些数据进行的修改或删除操作都必须等待这个锁的释放,产生的外在现象就是其他的操作将发生阻塞,这个这个操作commit或rollback.
同样这个查询的事务将会对该表加表级锁,不允许对该表的任何ddl操作,否则将会报出ora-00054错误::resource busy and acquire with nowait specified.
二、乐观封锁
乐观的认为数据在select出来到update进取并提交的这段时间数据不会被更改。这里面有一种潜在的危险就是由于被选出的结果集并没有被锁定,是存在一种可能被其他用户更改的可能。因此Oracle仍然建议是用悲观封锁,因为这样会更安全。
阻塞
定义:
当一个会话保持另一个会话正在请求的资源上的锁定时,就会发生阻塞。被阻塞的会话将一直挂起,直到持有锁的会话放弃锁定的资源为止。4个常见的dml语句会产生阻塞
INSERT
UPDATE
DELETE
SELECT…FOR UPDATE
INSERT
Insert发生阻塞的唯一情况就是用户拥有一个建有主键约束的表。当2个的会话同时试图向表中插入相同的数据时,其中的一个会话将被阻塞,直到另外一个会话提交或会滚。一个会话提交时,另一个会话将收到主键重复的错误。回滚时,被阻塞的会话将继续执行。
UPDATE 和DELETE当执行Update和delete操作的数据行已经被另外的会话锁定时,将会发生阻塞,直到另一个会话提交或会滚。
Select …for update
当一个用户发出select..for update的错作准备对返回的结果集进行修改时,如果结果集已经被另一个会话锁定,就是发生阻塞。需要等另一个会话结束之后才可继续执行。可以通过发出 select… for update nowait的语句来避免发生阻塞,如果资源已经被另一个会话锁定,则会返回以下错误:Ora-00054:resource busy and acquire with nowait specified.
死锁-deadlock
定义:当两个用户希望持有对方的资源时就会发生死锁.
即两个用户互相等待对方释放资源时,oracle认定为产生了死锁,在这种情况下,将以牺牲一个用户作为代价,另一个用户继续执行,牺牲的用户的事务将回滚.
例子:
1:用户1对A表进行Update,没有提交。
2:用户2对B表进行Update,没有提交。
此时双反不存在资源共享的问题。
3:如果用户2此时对A表作update,则会发生阻塞,需要等到用户一的事物结束。
4:如果此时用户1又对B表作update,则产生死锁。此时Oracle会选择其中一个用户进行会滚,使另一个用户继续执行操作。
起因:
Oracle的死锁问题实际上很少见,如果发生,基本上都是不正确的程序设计造成的,经过调整后,基本上都会避免死锁的发生。
DML锁分类表
表1 Oracle的TM锁类型
锁模式 锁描述 解释 SQL操作
0 none
1 NULL 空 Select
2 SS(Row-S) 行级共享锁,其他对象
只能查询这些数据行 Select for update、Lock for
update、Lock row share
3 SX(Row-X) 行级排它锁,
在提交前不允许做DML操作 Insert、Update、
Delete、Lock row share
4 S(Share) 共享锁 Create index、Lock share
5 SSX(S/Row-X) 共享行级排它锁 Lock share row exclusive
6 X(Exclusive) 排它锁 Alter table、Drop able、Drop index、Truncate table 、Lock exclusive
分享到:
相关推荐
Oracle锁是数据库并发控制的关键机制,它确保了在多用户环境下数据的一致性和完整性。当多个用户并发地访问和操作数据库中的数据时,如果没有适当的控制,可能会导致数据的不一致性和冲突。为了解决这个问题,Oracle...
Oracle从基础到应用的知识通常涉及以下几个核心知识点: 1. 数据库基础知识 - 关系数据库管理系统的原理和特点,以及非关系数据库和NoSQL数据库的区别。 - 数据库的三级模式结构,包括外模式、概念模式和内模式。...
对于初学者来说,理解Oracle的基础知识和基本语法是入门的关键。以下是一些Oracle基础知识的详细解释: 1. SQL*Plus工具:这是Oracle数据库管理员(DBA)和开发人员常用的命令行界面,用于执行SQL查询和其他数据库...
### Oracle数据库基础教程知识点概述 #### 一、数据库基础 1. **数据库简介**: - 数据库的概念:介绍数据库的基本定义,以及其在信息化社会中的重要作用。 - 数据库的发展历程:从早期的文件系统到关系型数据库...
### Oracle基础知识总结初学者必备 Oracle数据库作为一款广泛使用的数据库管理系统,在企业和开发领域扮演着重要的角色。对于初学者而言,掌握其基础知识是非常必要的。本文将根据提供的内容进行深入解析,并结合...
本套基础教程旨在帮助初学者快速掌握Oracle的核心概念和技术,包括安装配置、数据库管理以及日常维护等多个方面。以下是对各部分知识点的详细阐述: 1. **基础篇** - 数据库概念:了解数据库的基本定义,理解关系...
首先,Oracle锁主要分为两大类型:排它锁(X锁)和共享锁(S锁)。X锁不允许其他事务进行读写操作,确保数据的独占访问;S锁则允许事务进行读取,但禁止写操作,实现了数据的共享。这两种锁共同构成了Oracle并发控制...
本篇内容主要涵盖了Oracle数据库的几个高级应用基础知识点,包括数据库信息查询、会话管理、DML操作处理、条件判断语句、分页查询的实现等。 首先,利用`v$version`视图来查询数据库的版本信息是DBA的基本操作之一...
### Oracle开发基础知识点详解 #### 一、表空间与用户管理 **1. 创建表空间** - **语法**: `CREATE TABLESPACE 表空间名字 LOGGING DATAFILE '路径及文件名.dbf' SIZE 大小 AUTOEXTEND ON NEXT 大小 MAXSIZE 大小 ...
Oracle数据库基础学习 Oracle数据库基础学习是数据库学习的基础部分,本节课程将从DOS命令、SQL命令行、数据库简述、SQL语言简述、表等几个方面对Oracle数据库进行详细的介绍。 一、DOS命令 DOS命令是Disk ...
本文档主要探讨Oracle数据库的基础知识,包括数据库的概念、数据库实例、内存结构以及后台进程。 首先,数据库是Oracle系统的核心,是存储数据的逻辑结构。在一台主机上,可以安装多个Oracle数据库版本,如8i、9i、...
解决 Oracle 杀死死锁进程 Oracle 杀死死锁进程是数据库管理员经常遇到的问题,...解决 Oracle 杀死死锁进程需要具备扎实的 Oracle 基础知识和解决问题的经验。通过学习和实践,可以更好地掌握解决死锁问题的方法。
10、oracle之PLSQL基础.PPT 11、oracle之PLSQL高级.PPT 12、oracle之查询优化.PPT 12、数据库的规范化设计.PPT oracle管理之表空间和数据文件.PPT oracle管理之数据字典.PPT oracle管理之维护控制文件和重做日志文件...
知识点:SGA(System Global Area)是 Oracle 数据库的内存区域,用于存储数据库的各种信息,例如缓存、锁、日志等。每个服务器进程都有一个独立的 SGA。 5. 数据库字典视图 ALL_*视图只包含当前用户拥有的数据库...
【Oracle基础及实战】知识点详解 Oracle数据库是全球广泛使用的大型关系型数据库系统之一,它在企业级数据管理和分析中扮演着重要角色。本篇将深入探讨Oracle的基础知识和实战应用,包括表空间管理、权限管理、基础...
#### 一、Oracle死锁基础概念 - **DDL(Data Definition Language)**:指的是数据定义语言,用于创建、修改和删除数据库对象,如表、视图等。 - **DML(Data Manipulation Language)**:数据操纵语言,用于插入、...
我们将学习Oracle的事务概念、提交、回滚,以及锁定机制,如行级锁、表级锁,以确保数据的一致性和完整性。 第十章:数据库性能优化 最后,我们将讨论Oracle的性能优化策略,包括索引优化、SQL调优、物理数据库设计...
本资源包“oracle-study-resource”针对Oracle SQL的基础学习提供了宝贵材料,适合初学者及希望巩固基础的用户。 在Oracle SQL的学习中,以下几个核心知识点至关重要: 1. 数据库概念:理解数据库的基本构成,如表...
6. **第六章:事务与并发控制** - 事务的概念,ACID属性(原子性、一致性、隔离性、持久性),以及Oracle的锁定机制,如行级锁、表级锁等,都是这一章的重点。 7. **第七章:性能优化** - 学习者将学习如何使用SQL*...