Oracle的闩锁、锁定及并发性

数据库系统本身是一个多用户并发处理系统,在同一个时间点上,可能会有多个用户同时操作数据 库。这里就涉及两个很重要的问题。

这些用户之间的操作不会互相破坏。比如两个用户同时在相同的物理位置上写数据时,不能发生互 相覆盖的情况。这叫串行化,也就是说,即便两个用户同时写,也必须有先后,一个用户写完,另一个 用户继续写。串行化会降低系统的并发性,但这对于保护数据结构不被破坏来说则是必需的。

在满足串行化的前提下,如何将并发性提升到最大。

在Oracle数据库中,通过闩锁(latch)和锁定(lock)来解决这两个问题。闩锁和锁定既有相同点 又有不同点。相同点在于它们都是用于实现串行化的资源。而不同点则在于闩锁是一个低级别、轻量级 的锁,获得和释放的速度很快,以类似于信号灯的方式实现。而锁定则可能持续的时间很长,通过使用 队列,按照先进先出的方式实现。也可以简单地理解为闩锁是微观领域的,而锁定则是宏观领域的。

读完本章以后,我们能够了解到:

闩锁是什么,以及latch是如何保护资源的;

锁定(包括TX锁和TM锁)是如何保护资源的;

如何检测并解决锁定冲突;

DDL锁定的概念;

如何创建我们自己的锁定。

闩锁(latch)概述

Oracle数据库使用闩锁来管理内存的分配和释放。假设,某个用户进程(假设其为A)发出一条 update语句,要去更新58号数据块里的某条记录。则该用户进程对应的服务器进程在写内存的时候,找 到58号数据块,并往里写内容。A在写58号数据块的过程中,这时,另一个用户进程B发出insert语句, 要将某个新的记录插入到58号数据块里。如果没有一定的保护机制,A正要写入的空间可能会被B抢先写 入,或者相反,B正要写入的空间也可能会被A抢先写入。不管哪个用户先抢先写入,造成的结果就是, 58号数据块里的数据都混乱了,因为这时,A和B之间的数据互相交织在一起了。

因此,必须使用latch对此进行保护。简单来说,任何进程要写数据块时,都必须先获得latch,在 写入过程中,一直持有该latch,写完以后,释放该latch。对于上面的例子来说,当A在写入58号数据 块时,先获得latch,然后开始写。而当A正在写入的过程中,B也要写58号数据块。这时B在尝试获得 latch时,发现该latch正被其他用户(也就是A)持有,因此B进入等待状态。直到A写完数据块并释放 latch以后,B才能获得latch,获得latch以后,才能在58号数据块里写入数据。

这里只是以写数据块为例来说明为何要使用latch。而事实上,latch不仅仅用于写数据块,比如对 于shared pool来说,其内存单位就不是数据块了。latch也不仅仅用于写操作,只要涉及内存地址的读 和写,都需要通过获得latch来实现串行化,一次只能有一个服务器进程在读或者写内存地址。

Oracle在实例管理中,不管是buffer cache、shared pool还是log buffer,都引入了各种各样的 latch。

实现latch时,实际是由操作系统的旗语(semaphore:也叫信号量)来完成的。为了便于理解,可 以把它们想象为,通过某个变量值的变化而实现的。变量值为0则说明latch当前没有被其他进程获取, 否则如果为非0值,则说明它已经被其他进程所获取了。Oracle在设计latch的时候将其定义为轻量级锁 ,因此它的操作非常快,以微秒(microsecond,也就是百万分之一秒)来计算。

时间: 2025-01-23 20:10:53

Oracle的闩锁、锁定及并发性的相关文章

Oracle latch 闩锁结构 总结

以下内容太整理自网络,完全处于学习目的,如有侵权请及时联系我,我会立即删除. 一. Latch 说明 1.1 Latch Latch属于System Lock, 用于保护SGA区中共享数据结构的一种串行化锁定机制.Latch的实现是与操作系统相关的,尤其和一个进程是否需要等待一个latch.需要等待多长时间有关. Latch是Oracle提供的轻量级锁资源,是一种能够极快地被获取和释放的锁,能快速,短时间的锁定资源,防止多个并发进程同时修改访问某个共享资源,它只工作在SGA中,通常用于保护描述b

oracle中的闩锁(latch)简介

1.闩锁.锁定和并发性 数据库系统本身是一个多用户并发处理系统,在同一个时间点上,可能会有多个用户同时操作数据库.这里就涉及两个很重要的问题. 这些用户之间的操作不会互相破坏.比如两个用户同时在相同的物理位置上写数据时,不能发生互相覆盖的情况.这叫串行化,也就是说,即便两个用户同 时写,也必须有先后,一个用户写完,另一个用户继续写.串行化会降低系统的并发性,但这对于保护数据结构不被破坏来说则是必需的. 在满足串行化的前提下,如何将并发性提升到最大. 在Oracle数据库中,通过闩锁(latch)

DB2通用数据库的并发性

在数据库管理系统(DBMS)的领域中,术语"并发性"用于表示不止一个应用程序基本上(从用户的角度来看)同时访问同一数据的能力.因为 DBMS 的主要优点之一就是可以在多个用户和多个应用程序中共享数据,所以数据库系统应该提供一种管理并发访问数据的方法.DBMS 必须确保维护数据的一致状态和数据的完整性. 取得该效果的一种方法就是实施只串行(serial-only)模式来处理数据库请求.即每个事务都要等待另一事务(具有更高的优先权或者比它早启动)完成其工作.然而,对于现在的在线系统和客户异

Concurrency Kit 0.2发布 并发性工具

Concurrency Kit 是一款提供了大量的并发基元和无锁数据结构的并发性工具,其设计用于帮助高性能可扩展的并行系统的实施.主要特点是最大限度减少对限定操作系统接口的依赖性,大多数的接口依靠严格的标准库和流行的编译器扩展子集,提供统一的接口,便于程序在不同系统间的移植. Concurrency Kit 0.2该版本改善了RPM规范文件,修复一个ck_ring,手册页的开端,一个新的无锁SPMC哈希表. 软件信息:http://concurrencykit.org/ 下载地址:http://

Concurrency Kit 0.1.7发布 并发性工具

Concurrency Kit 是一款提供了大量的并发基元和无锁数据结构的并发性工具,其设计用于帮助高性能可扩展的并行系统的实施.主要特点是最大限度减少对限定操作系统接口的依赖性,大多数的接口依靠严格的标准库和流行的编译器扩展子集,提供统一的接口,便于程序在不同系统间的移植. Concurrency Kit 0.1.7该版本修复了以前版本中的编译错误,包括建立了DESTDIRhttp://www.aliyun.com/zixun/aggregation/34332.html">处理系统修复

Concurrency Kit 01.5发布 并发性工具

Concurrency Kit 是一款提供了大量的并发基元和无锁数据结构的并发性工具,其设计用于帮助高性能可扩展的并行系统的实施.主要特点是最大限度减少对限定操作系统接口的依赖性,大多数的接口依靠严格的标准库和流行的编译器扩展子集,提供统一的接口,便于程序在不同系统间的移植. Concurrency Kit 01.5该版本进行了clang的改善,变更ck_pr到ck_epoch,和一个新的基础设施FreeBSD的queue.h实现ck_queue.h. 软件信息:http://concurren

事务策略: 高并发策略-学习如何为支持高用户并发性的应用程序实现事务策略

简介:事务策略 系列文章的作者 Mark Richards 将讨论如何在 Java 平台中为具有高吞吐 量和高用户并发性需求的应用程序实现事务策略.理解如何进行折衷将帮助您确保高水平的数据完整性和 一致性,并减少随后开发流程中的重构工作. 我在本 系列 的前几篇文章中所介绍的 API 层 和 客户端编排策略 事务策略是应用于大多数标准业 务应用程序的核心策略.它们简单.可靠.相对易于实现,并且提供了最高水平的数据完整性和一致性. 但有时,您可能需要减小事务的作用域以获取吞吐量.改善性能并提高数据

了解Java 8功能如何让并发性编程变得更容易

在期待已久的 Java 8 版本中,并发性方面已实现了许多改进,其中包括在java.util.concurrent 层级中增加新的类和强大的新并行流 功能.设计流的目的是与lambda 表达式 共同使用,Java 8 的这项增强也使得日常编程的其他很多方面变得更加简便.(参见介绍 Java 8 语言的 指南文章,了解对于 lambda 表达式的介绍及相关 interface改动.) 本文首先介绍了新的 CompletableFuture 类如何更好地协调异步操作.接下来,我将介绍如何使用并行流(

全面解析oracle中的锁机制2

默认情况下 T@ora>create table t1 as select * from t ; Table created. Elapsed: 00:00:00.07 T@ora>select rowid,ora_rowscn,a from t1; ROWID                         ORA_ROWSCN          A ------------------                      ----------             --------