一、锁

  锁是一种安全机制,控制并发操作,防止用户读取其他用户正在更改的数据,或者多用户同时修改一个数据,从而保证事物的完整性和数据库的一致性。SQLserver 会自动强制执行锁,但是用户可以通过对锁进行了解并在应用程序中自定义锁来设计出高效率的应用程序。锁确定了并发事物访问资源的方式。

二、锁分类

共享锁:

  共享锁,锁定的资源可以被其他用户读取,但是其他用户不能听修改他(只读操作),  例如在select语句执行时,sqlserver 会对 对象进行共享锁锁定,对加共享锁的资源读取完毕之后,共享锁立即释放。(对于事物级别中 repeattable read,是这样的,在一个事物中,select 语句获取共享锁,查询完之后,不会释放共享锁,只有等到事物结束才会释放共享锁。)

排他锁:

  排它锁只允许锁定他的程序操作他。其他任何操作都不会被接受。例如执行update insert delete时sqlserver会自动是用排他锁,确保不会同时对一个资源多种操作。当对象上有其他锁时,无法对资源添加排它锁(这个也是事物中read commited 原理)。排它锁一直到事物结束才释放。

更新锁:

  用户更新资源时,防止死锁。

   下面是死锁现象

SQL-锁-事物级别                              SQL-锁-事物级别

  上面两个相同的事物同时执行,同时获取共享锁,  当他们更新的时候需要获取排它锁,但是由于其他事物存在其他类型的锁,不能使用排它锁,导致锁等待,都在等待另外一个事物释放共享锁。导致锁死。

  更新锁,可以防止死锁问题。因为一次只能有一个事物获取资源的更新锁,其他事物只能获得共享锁。sqlserver准备更新数据时,首先对资源添加更新锁,这样其他事物不能修改,只能读取。等到sqlserver确定要更新资源时,自动将更新锁转换为排它锁,否则锁转化为共享锁。

三、事物级别
CREATE DATABASE Test
GO
USE [Test]
GO
/****** Object:  Table [dbo].[UserTable]    Script Date: 2017/7/20 14:00:15 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[UserTable](
    [UserID] [int] IDENTITY(1,1) NOT NULL,
    [UserName] [nvarchar](50) NULL,
    [NewClo] [int] NULL,
 CONSTRAINT [PK_UserTable] PRIMARY KEY CLUSTERED 
(
    [UserID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
数据库初始化脚本

相关文章:

  • 2021-08-14
  • 2021-08-15
  • 2022-12-23
  • 2021-08-17
  • 2021-07-11
  • 2022-01-07
猜你喜欢
  • 2021-08-04
  • 2021-12-06
  • 2021-11-22
  • 2021-11-18
  • 2021-10-21
  • 2021-10-23
  • 2022-02-27
相关资源
相似解决方案