锁定是 Microsoft SQL Server 数据库引擎用来同步多个用户同时对同一个数据块的访问的一种机制。
在事务获取数据块当前状态的依赖关系(比如通过读取或修改数据)之前,它必须保护自己不受其他事务对同一数据进行修改的影响。 事务通过请求锁定数据块来达到此目的。 锁有多种模式,如共享或独占。 锁模式定义了事务对数据所拥有的依赖关系级别。 如果某个事务已获得特定数据的锁,则其他事务不能获得会与该锁模式发生冲突的锁。 如果事务请求的锁模式与已授予同一数据的锁发生冲突,则数据库引擎实例将暂停事务请求直到第一个锁释放。
当事务修改某个数据块时,它将持有保护所做修改的锁直到事务结束。 事务持有(所获取的用来保护读取操作的)锁的时间长度,取决于事务隔离级别设置。 一个事务持有的所有锁都在事务完成(无论是提交还是回滚)时释放。
应用程序一般不直接请求锁。 锁由数据库引擎的一个部件(称为“锁管理器”)在内部管理。 当数据库引擎实例处理 Transact-SQL 语句时,数据库引擎查询处理器会决定将要访问哪些资源。 查询处理器根据访问类型和事务隔离级别设置来确定保护每一资源所需的锁的类型。 然后,查询处理器将向锁管理器请求适当的锁。 如果与其他事务所持有的锁不会发生冲突,锁管理器将授予该锁。
|