NOLOCK和TransactionScope有什么区别?

时间:2012-02-21 07:10:01

标签: c# sql-server

有什么区别:

sqlCmd = "SELECT * FROM dbo.Products WITH (NOLOCK)";
List<Product> products = thisDl.ExecuteQuery<Product>(sqlCmd).ToList();

sqlCmd = "SELECT * FROM dbo.ProductItems WITH (NOLOCK)";
List<ProductItem> productItems = thisDl.ExecuteQuery<ProductItem>(sqlCmd).ToList();

using (new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted }))
{
    List<Product> products = (from p in dc.Products where select p).ToList();
    List<ProductItem> productItems = (from p in dc.ProductItems where select p).ToList();
}

在两者中,哪个更好用?

2 个答案:

答案 0 :(得分:2)

对于你的陈述,他们是一样的。现在推荐使用TransactionScope,据说NOLOCK用作最后的手段。

答案 1 :(得分:0)

<强> NOLOCK  表提示(也称为READUNCOMMITTED)仅适用于SELECT语句。 NOLOCK表示不会对表发出共享锁,禁止其他事务修改表中的数据。

该语句的好处是它允许您使数据库引擎不对查询中的表发出锁定;这会增加并发性和性能,因为数据库引擎不必维护所涉及的共享锁。 缺点是因为该语句不会对正在读取的表发出任何锁定,因此可能会读取一些“脏”的未提交数据。

TransactionScope 是一种更轻松,更快速的方式来获取对事务中数据的修改。但是TransactionScope功能更强大,它的掌握范围超出了数据库。 TransactionScope可以在事务中登记COM +对象等其他内容,您很快就会看到它与LINQ一起出现在数据查询中,在ADO.NET中出现在实体中。 TransactionScope:没有它就离开家。 TransactionScope 是支持数据库事务的一个渐进步骤。也许这个想法是一个易于使用的交易模型将是一个将被使用的模型。