数据库事务和锁

事务

(锁+回滚)作为工作单元执行的一系列操作。

显式事务和隐式事务

锁模式

排它锁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'

事务隔离级别

posted @ 2018-06-21 14:12  vvf  阅读(149)  评论(0编辑  收藏  举报