数据库的并发能力大家应该有目共睹了,功臣当然是众所周知的锁了。
可以在 SELECT、INSERT、UPDATE 及 DELETE 语句中为单个表引用指定锁提示。提示指定 Microsoft SQL Server 数据库引擎实例用于表数据的锁类型或行版本控制。当需要对对象所获得锁类型进行更精细控制时,可以使用表级锁提示。这些锁提示覆盖会话的当前事务隔离级别。
当启用了基于行版本控制的隔离级别时,数据库引擎 将维护修改的每一行的版本。应用程序可以指定事务使用行版本查看事务或查询开始时存在的数据,而不是使用锁保护所有读取。通过使用行版本控制,读取操作阻止其他事务的可能性将大大降低。
UPDATE Production.Product
WITH (ROWLOCK)
SET ListPrice = ListPrice * 1.10
WHERE ProductId=100 ;尝试为你的更新加上rowlock。
不申请共享锁:
SELECT * FROM Production.Product WITH (NOLOCK),尝试着给你的查询都加上nolock。
设置隔离级别:
对数据库的完整性和有效行要求不高的查询:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 或者SET TRANSACTION ISOLATION LEVEL READ NOLOCK
使用 PAGLOCK 或 TABLOCK 表提示,使数据库引擎使用页、堆或索引锁而不是行锁。但是,使用此选项增加了用户阻止其他用户尝试访问相同数据的问题,对于并发用户较多的系统,不应使用此选项。
对于读取操作,使用不会生成共享锁的隔离级别。
当 READ_COMMITTED_SNAPSHOT 数据库选项为 ON 时,使用 READ COMMITTED 隔离级别(产生共享锁)。
使用 SNAPSHOT 隔离级别(除非正在恢复数据库,否则 SNAPSHOT 事务不会在读取数据时请求锁。读取数据的 SNAPSHOT 事务不会阻止其他事务写入数据。写入数据的事务也不会阻止 SNAPSHOT 事务读取数据。)。
使用 READ UNCOMMITTED 隔离级别。此隔离级别只能用于能对脏读进行操作的系统。