C# DELETE是否适用于可序列化或可重复读取隔离级别

C# DELETE是否适用于可序列化或可重复读取隔离级别,c#,sql,.net,sql-server,sql-server-2008,C#,Sql,.net,Sql Server,Sql Server 2008,SQL Server 2008:我想将delete语句放在隔离级别设置为“可重复读取”或“可序列化”的“事务”中。我想知道我们是否可以在这些隔离级别中使用DELETE。 主要问题是,预期的锁(即仅对选定数据的锁)将与delete语句一起使用,还是delete将继续使用表锁?默认情况下,SQL Server中的任何操作都将使用行级锁(除非您对其进行了不同的配置)。当然,您可以对任何隔离级别使用DELETE。只有在以下情况下,DELETE才会跳转到表级锁:(1)您告诉它,或者(2)您试图在单个事务中

SQL Server 2008:我想将delete语句放在隔离级别设置为“可重复读取”或“可序列化”的“事务”中。我想知道我们是否可以在这些隔离级别中使用DELETE。
主要问题是,预期的锁(即仅对选定数据的锁)将与delete语句一起使用,还是delete将继续使用表锁?

默认情况下,SQL Server中的任何操作都将使用行级锁(除非您对其进行了不同的配置)。当然,您可以对任何隔离级别使用
DELETE
。只有在以下情况下,
DELETE
才会跳转到表级锁:(1)您告诉它,或者(2)您试图在单个事务中删除5000多行-在这种情况下,SQL Server将执行锁升级,并用单个表级锁替换5000个单行级锁确保列上有索引用于定位要删除的行。否则,需要进行完全扫描,这对任何事务隔离级别的并发性都是不利的。@DanGuzman:我对索引比较陌生。正如marc_s所提到的,如果我们修改语句的方式使它在一个事务中删除的行数不超过5000行,即使这样,我们还需要使用索引吗?仅供参考,我们有大约每天删除的10万条记录,所以我们应该使用事务模式还是修改语句在单个事务中删除5000行?@HimanshuSingla,索引和查询调优将有助于提高性能和并发性,即使您批量删除。如果没有有用的索引,每个
DELETE
执行的时间将逐渐延长,因为扫描的行越来越多,甚至锁定要删除的行。请注意,如果由于冲突而无法获取表级锁,则会延迟锁升级。在接下来的1250个锁之后,将再次尝试锁升级。