1.锁数据库
锁是事务获取的一种控制资源,用于数据资源,防止其余事务对数据进行冲突的或不兼容的访问。服务器
锁模式及其兼容性session
排他锁(exclusive lock),共享锁(shared lock);还有一些其余类型的锁(更新锁,意向锁、架构锁)。架构
当试图修改数据时,事务会为所依赖的数据资源请求排他锁,一旦授予,事务将一直持有排他锁,直至事务完成。这种锁模式之因此称为排他锁,是由于对于相同的数据资源,若是有其余事务已经得到了该资源的任何类型的锁,就不能再得到该资源的排他锁;若是有其余事务已经得到了该资源的排他锁,就不能再得到该资源的任何类型的锁。这是修改行为的默认处理方式,并且这种默认行为不能改变——不能改变为修改数据资源而请求锁模式(排他锁),也不能改变持有的时间长度(直到事务完成)。函数
当试图读取数据时,事务默认会为所依赖的数据资源请求其享锁,读操做一完成,就当即释放资源上的共享锁。这种锁模式之因此称为共享锁,是由于多个事务能够同时持有同一数据资源上的共享锁。虽然当修改数据时不能改变请求的锁模式和持续时间,但当读取数据时能够对如何处理锁定进行控制。rest
事务之间的相互制约关系就是锁的兼容性。server
排他锁和共享锁的兼容性:若是数据正在由一个事务进行修改,其余事务就既不能修改该数据,也不能读取(至少默认不能)该数据,直到第一个事务完成。若是数据正在由另外一个事务读取,其余事务就不能修改该数据(至少默认不能)。对象
可锁定资源的类型blog
SQL Server 能够锁定不一样类型或粒度的资源,这些资源类型包括RID 或KEY(行)、PAGE(页)、对象(例如,表)、数据库等。行位于页中,而页则是包含表或索引数据的物理数据块。索引
2. 检测阻塞
若是一个事务持有某一数据资源上的锁,而另外一事务请求相同资源上的不兼容的锁,则对新锁的请求将被阻塞,发出请求的事务进入等待状态。在默认状况下,被阻塞的请求会一直等待,直到原来的事务释放相关的锁。
只要可以在合理的时间范围内知足请求,系统中的阻塞就是正常的。可是,若是一些请求等待了太长的时间,可能就须要手工排除阻塞状态,看看能采起什么措施来防止这样长时间的延迟。例如,事务的运行时间过长,会致使持有锁的时间也太久;这时能够尝试缩短事务处理,把不属于工做单元的操做移到事务外面。在某些状况下,应用程序中的bug也可能致使事务一直打开;这时能够先把这样的bug找出来,修复它,确保在全部状况下均可以关闭事务。
要获得有关锁的信息(包括已经授予的锁和当前会话正等待授予的锁),能够在动态管理视图(DMV,dynamic management view)sys.dm_tran_locks;
SELECT
request_session_id AS spid,
resource_type AS restype,
resource_database_id AS dbid,
DB_NAME(resource_database_id) AS dbname,
resource_description AS res,
resource_associated_entity_id AS resid,
request_mode AS mode,
request_status AS status
FROM sys.dm_tran_locks;
每一个会话都由唯一的服务器进程标识符(SPID,server process ID)进行标识,能够经过查询@@SPID函数来查看会话的SPID。