在深入分析事务隔离级别和锁在MSSQL数据库机制

在深入分析事务隔离级别和锁在MSSQL数据库机制
锁机制

NOLOCK和READPAST的区别

1。打开事务以执行插入数据的操作
BEGINTRAN T

插入客户

select'a ',' '

2。执行查询语句。
选择*从客户(NOLOCK)

一个是结果。当1个事务回滚,然后将脏数据。(注:1交易不提交),是否表明一个共享锁不会被添加到数据表来防止其他事务修改数据表中的数据。
从客户中选择*

本声明将一直僵持到锁被删除或锁定的时间。(注意:设置锁定超时设置lock_timeout 1800)
选择*从客户(READPAST)

此语句将在未提交a之前显示状态,但不会锁定整个表。此提示表示,当数据库引擎返回结果时,将忽略锁定的行或数据页。

三.执行INSERT语句。
BEGINTRAN T

插入客户

select'b,B

提交经T

此时,即使步骤1的事务回滚,数据也将丢失,而b继续插入数据库中。

NOLOCK

1。执行以下语句。
开始TRAN TTT

选择*从客户(NOLOCK)

WAITFOR DELAY '00:00:20

提交TRAN TTT

注意:后面加上不加任何锁,它可以添加和删除不锁定。
插入客户select'a,B不锁定

删除客户ID = 1 -解锁

从客户解锁中选择*

更新客户设置标题= 'aa'where ID = 1不锁定

桨架
1。使用行锁执行查询。
设置事务隔离级别可重复读取(必须)

开始TRAN TTT

选择*从客户(桨架)id是17

WAITFOR DELAY '00:00:20

提交TRAN TTT

注意:当你删除和更新你正在查询的数据时,你锁定数据。对其他行的查询数据没有影响,而不是查询的增加。
插入客户select'a,B -不要等待

删除id = 17 -等待的客户

删除ID小于17的客户—不要等待

从客户中选择*不等待

更新客户设置标题= 'aa'where ID = 17等

更新客户设置标题= 'aa'where ID <> 17不要等待

HOLDLOCK,TABLOCK和TABLOCKX

1。执行HOLDLOCK
开始TRAN TTT

选择*从客户(HOLDLOCK)

WAITFOR DELAY '00:00:10

提交TRAN TTT

注意:其他事务可以读取表,但不能更新和删除。

更新客户设置标题=AA-等待10秒。

从客户中选择* -无需等待

2。执行TABLOCKX
开始TRAN TTT

选择*从客户(TABLOCKX)

WAITFOR DELAY '00:00:10

提交TRAN TTT

注意:其他事务不能读取表、更新和删除。

更新客户设置标题=AA-等待10秒。

从客户中选择*等待10秒。

三.execute TABLOCK
开始TRAN TTT

选择*从客户(TABLOCK)

WAITFOR DELAY '00:00:10

提交TRAN TTT

注意:其他事务可以读取表,但不能更新和删除。

更新客户设置标题=AA-等待10秒。

从客户中选择* -无需等待

udplock

1。在一个连接中执行。
开始TRAN TTT

选择*从客户(UPDLOCK)

WAITFOR DELAY '00:00:10

提交TRAN TTT

2。在其他连接中执行。

更新客户设置标题= 'aa'where ID = 1 -等待10秒

从客户中选择* -不必等待

插入客户select'a,B不需要等待

注:为udplock锁,只有更新数据锁定。

注意:使用这些选项将导致系统忽略最初设置在SET语句中的事务隔离级别(设置事务隔离级别)。

事务隔离级别

脏读:未读

脏读意味着当事务访问数据并修改数据时,修改尚未提交到数据库。同时,另一个事务也访问数据,然后使用数据。因为这个数据还没有提交,那么另一个事务读取的数据是脏数据,基于脏数据的操作可能是不正确的。

1。在一个连接中执行。
BEGINTRAN T

插入客户

选择'123 ','123

WAITFOR DELAY '00:00:20

提交经T

2。在B连接中执行。
设置事务隔离级别

从客户中选择*

在这个时候,未提交的数据将被'123显示,导致脏数据当一个事务被回滚。相当于(NOLOCK)

提交读取:读取已提交

1。在一个连接中执行。
BEGINTRAN T

插入客户

选择'123 ','123

WAITFOR DELAY '00:00:20

提交经T

2。在B连接中执行。
设置事务隔离级别

从客户中选择*

在这个时候,未提交的数据不会被'123的显示,并可以读取数据,在乙方提交后交易避免脏读。

不能重复读取:可重复读取

不可重复读是指在一个事务读取同一数据多次。当这个交易还没有结束,另一个事务访问相同的数据。在第一个事务读取的数据,从第一个交易两次可能由于在两读数据的第二交易性是不同的。这一切发生的时候,那是在一个事务读取两倍的数据是不同的,所以称为不可重复读取。

例如:

1。在连接中执行以下语句。
设置事务隔离级别可重复读取

开始TRAN TTT

从id = 17的客户中选择*

WAITFOR DELAY '00:00:30

从id = 17的客户中选择*

提交TRAN TTT

2。在B连接中执行以下语句,并在第一秒钟内等待三十秒。

更新客户设置标题= 'd'where ID = 17

这一次,连接将被锁定,直到连接结束时才能被执行,连接中的两个读取数据是相同的,并且不受B连接的干扰。

注意,对于读提交和读未提交,B连接将不会被锁定。在连接完成之前,两个查询语句是不同的,也就是说,第二个查询的标题是D。

阅读:序列化序列化

1。在一个连接中执行。
设置一个事务的隔离级别

BEGINTRAN T

更新客户设置标题= '111

WAITFOR DELAY '00:00:20

提交经T

2。在B连接中执行,并在A.执行后20秒之内执行。
开始TRAN TT

插入客户

选择2,2

提交TRAN TT

在提交连接的事务之前,不能将B连接插入到表中的数据,这避免了读取的错觉。

注:幻觉是常见的现象,当交易没有被独立地执行,例如,第一个事务修改表中的数据,包括表中的所有数据行。同时,第二交易也修改表中的数据,这是插入一行插入表中的新数据然后,在未来,经营第一交易用户没有修改的数据行的表中,如果出现了一个幻觉。

共享锁

共享锁(S锁)允许并发事务读取(选择)资源在封闭的并发控制(指的是并发控制的类型)。当一个共享锁(S锁)上存在的资源,其它事务不能修改数据,一次读操作完成,共享锁(S锁)对资源是立即释放,除非事务隔离级别设置为可重复读或更高的水平,或者共享锁被保留在交易时间锁定提示(S锁)。

更新锁

更新锁(U锁)可以防止常见的死锁。在可重复读取或序列化事务中,事务读取数据{获取资源(页或行)的共享锁(锁)},然后修改数据。此操作需要锁是X锁。如果两交易获得的共享模式锁的资源,然后尝试更新数据的同时,一个事务试图将锁定为独占锁(X锁)。从共享模式锁的转换必须等待一段时间,因为一个事务独占锁和共享锁的其他交易模式不兼容,和锁等待发生。第二交易试图获得独占锁(X锁)更新。因为两交易转换为排他锁(X锁)和每个事务等待另一个事务释放一个共享锁,死锁发生。

为了避免这个潜在的死锁问题,使用更新锁(U锁)。只有一个事务可以每次获得资源的更新锁(U锁)。如果事务修改了资源,更新锁(U锁)被转换为独占锁(x锁)。

独占锁

独占锁(x锁)防止并发事务访问资源。当使用独占锁(X锁)时,没有其他事务可以修改数据。只有当NOLOCK提示介绍或读隔离级别是不读,将读操作被执行。

数据修改语句(如插入,更新,删除,修改和读取操作)结合,语句首先执行读操作执行所需的修改操作之前得到的数据,因此,数据修改语句通常需要一个共享锁和独占锁。例如,UPDATE语句可以修改另一个表中基于一个表的连接的行。在这种情况下,除了在更新行的独占锁,UPDATE语句也会请求共享锁的行,在连接表中读取。
免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部