热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Oracle并发控制、事务管理学习笔记-mysql教程

另外,对应于Oracle的管理客户端工具SQL*Plus,在SQLServer2000中是osql,两种管理工具都是命令行工具,使用方式及作用也类似,

另外,对应于Oracle的管理客户端工具SQL*Plus,在SQL Server 2000中是osql,两种管理工具都是命令行工具,使用方式及作用也类似,

(a)基本概念
锁的2种最基本、最简单的类型:排他锁(eXclusive lock,即X锁)、共享锁(Share lock,即S锁)。
不同级别的锁定协议及其作用:

申请的锁

及其作用

锁定协议

修改时申请X锁

读取时申请S锁

作用

操作

结束

释放

事务

结束

释放

操作

结束

释放

事务

结束

释放

丢失

修改

脏读

重复读

一级锁定协议

二级锁定协议

三级锁定协议

锁定对象的大小被称为锁定的粒度(granularity)。
如果在一个数据库管理系统中,同时支持多种锁定粒度供事务选择,这种锁定方法就被称为多粒度锁定(multiple granularity locking)。
多粒度锁定协议是指,允许对多粒度树中的节点单独地加锁,另外,对一个节点加锁还意味着对这个节点的各级子节点也加同样的锁。因此,可以用两种方法对多粒度树中的节点加锁:显式锁定、隐式锁定。显式锁定是在事务中明确指定要加在节点上的锁;隐式锁定是由于在其上级节点中加显式锁时而使该节点获得的锁。

具有意向锁的多粒度锁定方法能提高系统的并发度,减少加锁和解锁的开销。
意向锁的含义是,如果对一个节点加某种意向锁,则表示对它的所有下级节点加这种锁的意向;如果对一个节点加某种锁,则必须先对该节点的各级上级节点加这种意向锁。
有如下几种意向锁。
一、IS锁(Intended Share lock,意向共享锁)
二、IX锁(Intended eXclusive lock,意向排他锁)
三、SIX锁(Share Intended eXclusive lock,共享意向排他锁)
如果对一个节点加SIX锁,则表示对它加S锁,然后再加IX锁,即SIX=S+IX。例如,如果事务T对表A加SIX锁,则表示事务T要读取整个表(S锁的作用),同时还会更新某些记录(IX锁的作用)。
包括意向锁的各种锁之间的相容规则:(NL表示没有锁定)

T保持的锁
Ti想获取的锁 NL IS

IX

S SIX X

IS 可以 可以 可以 可以 可以 不可以

IX 可以 可以 可以 不可以 不可以 不可以

S 可以 可以 不可以 可以 不可以 不可以

SIX 可以 可以 不可以 不可以 不可以 不可以

X 可以 不可以 不可以 不可以 不可以 不可以

死锁是一种比较严重的、特殊的锁争用类型。在这种锁争用中,两个或两个以上的用户正在等待对方锁定的资源。因此,如果不进行某种干预,任意一个事务都无法完成。
诊断死锁方法有:
*超时法。如果一个事务的等待时间超过了规定的时限,,就认为发生了死锁。
*等待图法。这是用离散数学的图论来诊断死锁的方法。事务的等待图是一个有向图G=(T,U)。T为正在运行的各个事务的节点的集合,U为有向边。如果T1 事务等待T2事务,则在T1、T2节点之间就有一条从T1指向T2的有向边。DBMS的并发控制子系统周期性地(如每隔1分钟)检测事务等待图。如果发现图中存在回路,则表示系统中出现了死锁。

(b)DDL锁
Oracle主要有2种锁:DDL锁(字典锁)、DML锁(数据锁)。
DDL锁能防止在用DML语句操作数据库表时,对表进行删除,或对表的结构进行更改。
DDL锁由Oracle自动加锁和释放。不能显式地给对象加DDL锁,即没有加DDL锁的语句。
DDL锁的类型与特征:

类型 加锁条件/原因 特征

共享DDL锁 当发布audit、grant、revoke、comment、create procedure、create function、create package等这种DDL语句时 1) 不能防止类似的DDL语句或任何DML语句操作对象,但能防止另一个用户改变或删除已引用的对象
2) 在DDL语句执行期间,该DDL锁一直保持,直到发生一个隐式的提交

排他DDL锁 当发布create table、alter table、drop table、delete from table、truncate table等这种DDL语句时 假如一个用户在表上具有锁,不管它是什么级别、什么类型的锁,另一个用户就不能在该表上加排他DDL锁

可分解的解析锁

(breakable parse lock)

SQL共享池里的语句或PL/SQL对象具有一个用于它所引用的每一个对象的锁 用来保护SQL共享池里的各个语句或PL/SQL对象。假如被引用的对象改变了,该锁能检查语句是否失效。只要语句还在SQL共享池中,该锁就存在

(c)DML锁
根据锁定的粒度和意向,DML锁有几种模式。
RS(Row Share)或SS(Sub Share)
RX(Row eXclusive)或SX(Sub eXclusive)
S(Share)
SRX(Share Row eXclusive)或SSX(Share Sub eXclusive)
X(eXclusive)
可以从%ORACLE_HOME%/RDBMS /ADMIN目录中的dbmslock.sql脚本中找到DML锁的模式的相容规则。

==================

-- These are the various lock modes (nl -> "NuLl", ss -> "Sub Shared",
-- sx -> "Sub eXclusive", s -> "Shared", ssx -> "Shared Sub eXclusive",
-- x -> "eXclusive").
--
-- A sub-share lock can be used on an aggregate object to indicate that
-- share locks are being aquired on sub-parts of the object. Similarly, a
-- sub-exclusive lock can be used on an aggregate object to indicate
-- that exclusive locks are being aquired on sub-parts of the object. A
-- share-sub-exclusive lock indicates that the entire aggregate object
-- has a share lock, but some of the sub-parts may additionally have
-- exclusive locks.
--
-- Lock Compatibility Rules:
-- When another process holds "held", an attempt to get "get" does
-- the following:
--
-- held get-> NL SS SX S SSX X
-- NL SUCC SUCC SUCC SUCC SUCC SUCC
-- SS SUCC SUCC SUCC SUCC SUCC fail
-- SX SUCC SUCC SUCC fail fail fail
-- S SUCC SUCC fail SUCC fail fail
-- SSX SUCC SUCC fail fail fail fail
-- X SUCC fail fail fail fail fail

==================

(d)数据库级别锁定
Oracle可以在数据库、表、行这3个级别上使用锁。
锁定数据库有2种方法:将数据库设置成受限方式、将数据库更改成只读方式。
在shutdown数据库后,通过startup restrict命令来在启动数据库时将其设置成受限方式。也可以通过alter system enable restricted session或alter system disable restricted session语句来在打开数据库的情况下启用或禁用数据库的受限方式。当数据库处于受限方式时,只允许具有 restrictive session系统权限的用户(如sys用户)连接到数据库。已经连接的会话不受alter system enable restricted session语句的影响,只有试图进行连接的新的会话会被限制。
将数据库更改成read only(只读)方式后,只能查询数据而不允许对数据进行任何DML操作。
SQL> STARTUP MOUNT
SQL> ALTER DATABASE OPEN READ ONLY;
如果要将数据库再按读写方式打开,可以用STARTUP FORCE命令重启数据库。
set transaction read only语句可以将事务设置成只读事务,即将数据库"冻结"到该事务开始的那一点上,直至显式地发布了COMMIT或ROLLBACK命令或隐式提交(执行DDL)。在只读事务中所查询到的数据反映的是该事务开始时已经存在的数据库中的数据,即便在此同时其他事务更改并提交了数据库中的数据也是如此,但并不锁定数据库。

推荐阅读
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 构建基于BERT的中文NL2SQL模型:一个简明的基准
    本文探讨了将自然语言转换为SQL语句(NL2SQL)的任务,这是人工智能领域中一项非常实用的研究方向。文章介绍了笔者在公司举办的首届中文NL2SQL挑战赛中的实践,该比赛提供了金融和通用领域的表格数据,并标注了对应的自然语言与SQL语句对,旨在训练准确的NL2SQL模型。 ... [详细]
  • 在使用 DataGridView 时,如果在当前单元格中输入内容但光标未移开,点击保存按钮后,输入的内容可能无法保存。只有当光标离开单元格后,才能成功保存数据。本文将探讨如何通过调用 DataGridView 的内置方法解决此问题。 ... [详细]
  • 本文详细介绍了如何在 Linux 平台上安装和配置 PostgreSQL 数据库。通过访问官方资源并遵循特定的操作步骤,用户可以在不同发行版(如 Ubuntu 和 Red Hat)上顺利完成 PostgreSQL 的安装。 ... [详细]
  • 如何在PostgreSQL中查看数据表
    本文将指导您使用pgAdmin工具连接到PostgreSQL数据库,并展示如何浏览和查找其中的数据表。通过简单的步骤,您可以轻松访问所需的表结构和数据。 ... [详细]
  • 利用存储过程构建年度日历表的详细指南
    本文将介绍如何使用SQL存储过程创建一个完整的年度日历表。通过实例演示,帮助读者掌握存储过程的应用技巧,并提供详细的代码解析和执行步骤。 ... [详细]
  • 本文介绍了如何通过 Maven 依赖引入 SQLiteJDBC 和 HikariCP 包,从而在 Java 应用中高效地连接和操作 SQLite 数据库。文章提供了详细的代码示例,并解释了每个步骤的实现细节。 ... [详细]
  • 在使用SQL Server进行动态SQL查询时,如果遇到LIKE语句无法正确返回预期结果的情况,通常是因为参数传递方式不当。本文将详细探讨这一问题,并提供解决方案及相关的技术背景。 ... [详细]
  • 本文介绍如何通过创建替代插入触发器,使对视图的插入操作能够正确更新相关的基本表。涉及的表包括:飞机(Aircraft)、员工(Employee)和认证(Certification)。 ... [详细]
  • MySQL缓存机制深度解析
    本文详细探讨了MySQL的缓存机制,包括主从复制、读写分离以及缓存同步策略等内容。通过理解这些概念和技术,读者可以更好地优化数据库性能。 ... [详细]
  • SQLite 动态创建多个表的需求在网络上有不少讨论,但很少有详细的解决方案。本文将介绍如何在 Qt 环境中使用 QString 类轻松实现 SQLite 表的动态创建,并提供详细的步骤和示例代码。 ... [详细]
  • 精选30本C# ASP.NET SQL中文PDF电子书合集
    欢迎订阅我们的技术博客,获取更多关于C#、ASP.NET和SQL的最新资讯和资源。 ... [详细]
  • MySQL 数据库迁移指南:从本地到远程及磁盘间迁移
    本文详细介绍了如何在不同场景下进行 MySQL 数据库的迁移,包括从一个硬盘迁移到另一个硬盘、从一台计算机迁移到另一台计算机,以及解决迁移过程中可能遇到的问题。 ... [详细]
  • Hadoop入门与核心组件详解
    本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
  • 本文介绍如何在 FireDAC 环境下实现 FDMEMTable 字段的自动获取,为开发人员提供便捷的数据处理方式。 ... [详细]
author-avatar
执爱马嘟嘟_539
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有