SQLServer2014共享锁
共享锁(SharedLock):由读取页的进程所使用。共享锁只在特定页的读取过程中有效修改锁(UpdateLock);用于将要1修改数据的进程,当数据发生变化时,修改锁自独占锁(ExclusiveLock):用于当前正在修改数据的进程。独占锁作用于所有影响动放为独占镇到的页上直至事务结束锁也有不同的粒度,锁的粒度即锁的对象,可以是索引、表、数据据页等。粒度大,封锁机制简单,开销小,并发度低:粒度小,封锁机制复杂,开销大,并发度高。封锁机制是由SQL Server2014自动完成成,它保证了数据的一致性,但是也不可避免地带来了死锁问题。
当两个或多个进程各自对一些数据对象加锁,同时又要中请已被别的进程死锁的数据对象时,就可能发生死锁。死锁发生时,死锁的任何进程都无法进行,系统的性能受到严重影响,甚至造成数据丢失最大限度地发挥并发性和性能,就应该尽可能地在进程间减少争用,同时降低死锁的可能性。
以下是一些方法:保证事务尽可能小,如避免加锁状态下的用户交互复杂计算、不相关任务,这样可以减少锁定保持的时间。用存储过程控制易造成死锁的数据对象,因为存储过程执行得更快创建有用的索引,以加快事务的执行,减少封锁时间。进行数据划分,避免“热点”SQLServer2014能自动使用与任务相对应的等级锁来锁定资源对象,以使锁的成本最小化。
所以,用户只需要了解封锁机制的基本原理,使用中不涉及锁的操作。也可以说,SQLServer的封锁机制对用户是透透明的。SQLServer除了能够支持ANSISQL标注的4种隔离级别外,还有两种使用行版本控制来读取数据的事务级别。行版本控制允许一个事务在数据排他锁锁定后读取数据的最后提交版本。由于不必等待到锁释放就可进行读操作,因此查询性能得以大大增强。这两种隔离级别如下:已提交读快照照:它是一种提交读级别的新实现.不像一般的提交读级别,SQLServer会读取最后提交的版本并因此不必在进行读操作时等待直到锁被释放。这个级别可以替代提交读级别。
快照:这种隔离使用行版本来提供事务级别的读取一致性。这意味着在一个事务中,由于读一致性可以通过行版本控制实现,因此同样的数据总是可以像在可序列化级别上一样被读取而不必为防止来自其他事务的更改而被锁定。无论定义什么隔离级别,对数据的更改总是通过排他锁来锁定并直到事务结束时才释放。很多情况下,定义正确的隔离级别并不是一个简单的决定。
小编结语:作为一种通用的规则,要选择在尽可能短的时间内锁住最少数据,但同时依然可以为事务提供它所需的安全程度的隔离级别。在SQLServer2014中,有两种方法可以设置隔离级别:设置TIMEOUT参数和使用SETRANSACTION语句设置隔离级别。例如,下面语句实现被锁超时5秒将自动解锁SetLockTimeout5000。