事务
(锁+回滚)作为工作单元执行的一系列操作。
显式事务和隐式事务
锁模式
排它锁exclusive lock
共享锁shared lock
更新锁
兼容共享锁,不兼容更新锁、排它锁
意向锁
目的:在较高粒度级别有效监测不兼容的锁定请求,防止授予不兼容的锁。
架构锁
其他更高级锁
锁的兼容性
事务之间相互制约的关系就是锁的兼容性。
可锁定资源类型
可锁定资源类型或粒度资源,包括RID 或者KEY(行) 、PAGE(页) 、 对象(如:表) 、数据库等。
其他更高级的可锁定类型:EXTENT(区,表在物理上可以分为多个更小单元,即分区)、分配单元(ALLOCATION_UNIT) 、堆(HEAP) 、B-tree
行位于页中,页是包含表或者索引数据的物理数据块
为了获得特定资源类型上的锁,事务必须在更高的粒度级别上获得相同模式的意向锁。
锁升级
SQL Server可以先获得细粒度的锁(如行、页锁),在某些情况下尝试升级为更粗粒度的锁(如表锁)。例如:单个语句获得至少5000个锁时,就触发锁升级。(?)
锁隔离级别
决定如何控制并发用户读写数据的操作。读操作默认使用共享锁,写操作需要使用排它锁。对于操作获得的锁,以及锁的持续时间来说,虽然不能控制写的操作方式,但可以控制读操作的行为方式,隐含得影响写操作的行为。
设置方式:1.会话选项设置隔离级别 SET TRANSACTION ISOLATION LEVEL <isolation name> 2.查询级别上使用表提示设置隔离级别 SELECT 。。。 FROM <Table> WITH (<isolation name>)
6个隔离级别
READ UNCOMMITTED 未提交读 (NOLOCK) 读操作不请求共享锁,允许脏读
READ COMMITTED 已提交读 (default) 防止脏读的最低隔离级别,读操作必须获取共享锁才能操作。此隔离级别中,读操作已完成就立即释放资源上的共享锁。读操作不会在事务持续期间内保留共享锁。甚至,在语句结束前也不能保留共享锁。这意味着一个事务内对相同数据资源的读操作之间,没有共享锁会锁定该资源。其他事务可以在两个读操作之间修改该资源,导致两次取到不同的值。这种现象称为:不可重复读
REAPEATABLE READ 可重复读 事务中的读操作需要获取共享锁才能读取数据,而且共享锁将一直保持到事务完成为止。
SERIALIZABLE可序列化 (HODELOCK) 上一个隔离级别(REPEATABLE READ)中事务在第一次读取某些行后,可以重复读取这些行。但是事务只是锁定第一次查询找到的那些资源(如:行),如果其他事务插入新行,而且新行满足读操作的查询条件,那么第二次读取的结果会包含新行。这种新行为成为幻读。
SNAPSHOT 快照
READ COMMITTED SNAPSHOT 已经提交读隔离
隔离级别总结
获取隔离级别 :DBCC USEROPTIONS
设置隔离级别:SET TRAN ISOLATION LEVEL [READ UNCOMMITTED]
等待 waitfor delay '00:00:15'