一、 锁的分类
锁的类别有两种分法:
1. 从数据库系统的角度来看:分为独占锁(即排它锁),共享锁和更新锁MS-SQL Server 使用以下资源锁模式。
锁模式 描述
共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。
更新 (U) 用于可更新的资源中。防止当多个会话在读取、锁定以及随后可能进行的资源更新时发生常见形式的死锁。
排它 (X) 用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。
意向锁用于建立锁的层次结构。意向锁的类型为:意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。
架构锁在执行依赖于表架构的操作时使用。架构锁的类型为:架构修改 (Sch-M) 和架构稳定性 (Sch-S)。
大容量更新 (BU) 向表中大容量复制数据并指定了 TABLOCK 提示时使用。
共享锁
共享 (S) 锁允许并发事务读取 (SELECT) 一个资源。资源上存在共享 (S) 锁时,任何其它事务都不能修改数据。一旦已经读取数据,便立即释放资源上的共享 (S) 锁,除非将事务隔离级别设置为可重复读或更高级别,或者在事务生存周期内用锁定提示保留共享 (S) 锁。
更新锁
更 新 (U) 锁可以防止通常形式的死锁。一般更新模式由一个事务组成,此事务读取记录,获取资源(页或行)的共享 (S) 锁,然后修改行,此操作要求锁转换为排它 (X) 锁。如果两个事务获得了资源上的共享模式锁,然后试图同时更新数据,则一个事务尝试将锁转换为排它 (X) 锁。共享模式到排它锁的转换必须等待一段时间,因为一个事务的排它锁与其它事务的共享模式锁不兼容;发生锁等待。第二个事务试图获取排它 (X) 锁以进行更新。由于两个事务都要转换为排它 (X) 锁,并且每个事务都等待另一个事务释放共享模式锁,因此发生死锁。
若要避免这种潜在的死锁问题,请使用更新 (U) 锁。一次只有一个事务可以获得资源的更新 (U) 锁。如果事务修改资源,则更新 (U) 锁转换为排它 (X) 锁。否则,锁转换为共享锁。
排它锁
排它 (X) 锁可以防止并发事务对资源进行访问。其它事务不能读取或修改排它 (X) 锁锁定的数据。
意向锁
意向锁表示 SQL Server 需要在层次结构中的某些底层资源上获取共享 (S) 锁或排它 (X) 锁。例如,放置在表级的共享意向锁表示事务打算在表中的页或行上放置共享 (S) 锁。在表级设置意向锁可防止另一个事务随后在包含那一页的表上获取排它 (X) 锁。意向锁可以提高性能,因为 SQL Server 仅在表级检查意向锁来确定事务是否可以安全地获取该表上的锁。而无须检查表中的每行或每页上的锁以确定事务是否可以锁定整个表。
意向锁包括意向共享 (IS)、意向排它 (IX) 以及与意向排它共享 (SIX)。
锁模式 描述
意向共享 (IS) 通过在各资源上放置 S 锁,表明事务的意向是读取层次结构中的部分(而不是全部)底层资源。
意向排它 (IX) 通过在各资源上放置 X 锁,表明事务的意向是修改层次结构中的部分(而不是全部)底层资源。IX 是 IS 的超集。
与 意向排它共享 (SIX) 通过在各资源上放置 IX 锁,表明事务的意向是读取层次结构中的全部底层资源并修改部分(而不是全部)底层资源。允许顶层资源上的并发 IS 锁。例如,表的 SIX 锁在表上放置一个 SIX 锁(允许并发 IS 锁),在当前所修改页上放置 IX 锁(在已修改行上放置 X 锁)。虽然每个资源在一段时间内只能有一个 SIX 锁,以防止其它事务对资源进行更新,但是其它事务可以通过获取表级的 IS 锁来读取层次结构中的底层资源。
独占锁:只允许进行锁定操作的程序使用,其他任何对他的操作均不会被接受。执行数据更新命令时,SQL Server会自动使用独占锁。当对象上有其他锁存在时,无法对其加独占锁。
共享锁:共享锁锁定的资源可以被其他用户读取,但其他用户无法修改它,在执行Select时,SQL Server会对对象加共享锁。
更新锁:当SQL Server准备更新数据时,它首先对数据对象作更新锁锁定,这样数据将不能被修改,但可以读取。等到SQL Server确定要进行更新数据操作时,他会自动将更新锁换为独占锁,当对象上有其他锁存在时,无法对其加更新锁。
2. 从程序员的角度看:分为乐观锁和悲观锁。
乐观锁:完全依靠数据库来管理锁的工作。
悲观锁:程序员自己管理数据或对象上的锁处理。
MS-SQLSERVER 使用锁在多个同时在数据库内执行修改的用户间实现悲观并发控制
三 锁的粒度
锁粒度是被封锁目标的大小,封锁粒度小则并发性高,但开销大,封锁粒度大则并发性低但开销小
SQL Server支持的锁粒度可以分为为行、页、键、键范围、索引、表或数据库获取锁
资源 描述
RID 行标识符。用于单独锁定表中的一行。
键 索引中的行锁。用于保护可串行事务中的键范围。
页 8 千字节 (KB) 的数据页或索引页。
扩展盘区相邻的八个数据页或索引页构成的一组。
表 包括所有数据和索引在内的整个表。
DB 数据库。
-------------------------------------------------------------------------------------------------------------------------------------------------------------
简单点来说:
共享锁:如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能加排他锁。获准共享锁的事务只能读数据,不能修改数据。
排他锁:如果事务T对数据A加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。
-------------------------------------------------------------------------------------------------------------------------------------------------------------
死锁的发生必须具备以下四个必要条件。
简要说明为什么会发生死锁?解决死锁的主要方法是什么?
若干事务相互等待释放封锁,就陷入无限期等待状态,系统就进入死锁
解决死锁的方法应从预防和解除的两个方面着手:
(1)死锁的预防方法:
①要求每一个事务必须一次封锁所要使用的全部数据(要么全成功,要么全不成功)
②规定封锁数据的顺序,所有事务必须按这个顺序实行封锁。
也就是说通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或者几个,来预防发生死锁。
(2)允许死锁发生,然后解除它,如果发现死锁,则将其中一个代价较小的事物撤消
,回滚这个事务,并释放此事务持有的封锁,使其他事务继续运行。
二、根据锁来解决数据库脏读、不可重读、幻读等问题:
1 脏读:修改时加排他锁,直到事务提交后才释放,读取时加共享锁,读取完释放事务1读取数据时加上共享锁后(这 样在事务1读取数据的过程中,其他事务就不会修改该数据),不允许任何事物操作该数据,只能读取,之后1如果有更新操作,那么会转换为排他锁,其他事务更 无权参与进来读写,这样就防止了脏读问题。
但是当事务1读取数据过程中,有可能其他事务也读取了该数据,读取完毕后共享锁释放,此时事务1修改数据,修改 完毕提交事务,其他事务再次读取数据时候发现数据不一致,就会出现不可重复读问题,所以这样不能够避免不可重复读问题。
2 不可重复读:读取数据时加共享锁,写数据时加排他锁,都是事务提交才释放锁。读取时候不允许其他事物修改该数据,不管数据在事务过程中读取多少次,数据都是一致的,避免了不可重复读问题
3 幻读问题:采用的是范围锁RangeS RangeS_S模式,锁定检索范围为只读,这样就避免了幻影读问题。
死锁图:
相关推荐
数据集专题-数据分析开发人员必看-职务名称-可直接导入数据库-国标 -.sql
- 并发控制:确保多个事务同时运行时不破坏数据的一致性,如锁机制、多版本并发控制(MVCC)等。 7. 数据库性能优化: - 索引:提高查询速度的数据结构,合理创建和使用索引可以显著提升性能。 - 查询优化:通过...
数据库实验-锁冲突与死锁
7. **数据库性能优化**:包括索引的使用、查询优化、存储过程、触发器以及数据库的并发控制机制,如锁和多版本并发控制(MVCC)。 8. **分布式数据库与云数据库**:随着云计算的发展,分布式数据库和云数据库的重要...
在Oracle数据库的管理与维护过程中,数据库管理员和开发人员常常会遇到各类错误信息,错误编码大全为他们提供了快速定位和解决问题的途径。下面将详细介绍标题和描述中提及的几个Oracle错误编码,以及通过部分列出的...
2. **数据库锁**:用于在多用户环境中控制对数据的并发访问。 - **行锁**:包括共享锁(S)和排他锁(X),以及记录锁、间隙锁、Next-Key Lock和插入意向锁。例如,`SELECT ... FOR SHARE/UPDATE` 可以在查询时添加共享...
7. **并发控制**:在多用户环境下,同时处理多个事务的机制,如封锁、乐观锁和多版本并发控制(MVCC),以防止数据不一致。 8. **故障恢复**:通过日志记录、检查点和回滚等技术,确保系统在发生故障后能恢复到一致...
并发控制通过锁、多版本并发控制(MVCC)等方式解决多个用户同时访问数据库时可能出现的问题。安全性则涉及到用户权限管理、审计和加密等功能,保护数据不被未经授权的访问和修改。 最后,数据库管理员(DBA)的...
封锁机制包括多种不同的锁定策略,如排他锁和共享锁,以及如何根据不同的锁定策略进行事务调度。 关于查询语言SQL的部分,文档指出学生需要掌握单表查询、多表连接查询(包括内连接、外连接)、聚合函数和复杂查询...
数据库基础知识点学习是数据库管理系统(DBMS)的核心组成部分,涉及到数据库设计、关系数据库规范化、事务管理、数据库安全、数据库管理系统、数据独立性、事务并发控制、分布式数据库等多方面的知识点。...
数据集专题-数据分析开发人员必看-职业分类-可直接导入数据库-国标 -gb6565
数据集专题-数据分析开发人员必看-专业名称-可直接导入数据库-国标 -gb16835
Sybase 数据库锁机制和锁表查询 Sybase 数据库锁机制是指数据库管理系统中用于控制并发访问和维护数据一致性的机制。锁机制可以防止多个事务同时访问同一资源,避免数据的不一致和损坏。 在 Sybase 数据库中,锁...
数据集专题-数据分析开发人员必看-学位名称-可直接导入数据库-国标 -gb6864.sql
数据集专题-数据分析开发人员必看-家庭家族之间称谓代码-可直接导入数据库-国标 -gb4761.sql
数据集专题-数据分析开发人员必看-国内行政区划代码-可直接导入数据库-国标 -gb2260.sql
事务的ACID属性(原子性、一致性、隔离性和持久性)是确保数据一致性的基础,通过锁机制、乐观锁和多版本并发控制(MVCC)等方法实现。 - 死锁:当两个或更多事务相互等待对方释放资源时,会出现死锁。数据库管理...
数据集专题-数据分析开发人员必看-专业技术职务代码-可直接导入数据库-国标gb8561.sql
数据集专题-数据分析开发人员必看-北京行政区域划分(到社区)-可直接导入数据库-国标 -gbt2260.sql