锁机制
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语句也会请求共享锁的行,在连接表中读取。