【发布时间】:2017-02-15 06:14:47
【问题描述】:
我正在使用返回 5-6 个表的存储过程,并且该过程可能同时被许多用户(5-10 个用户)同时使用。
过程只有“选择”语句。
所以我只是想确认当过程调用或没有锁时,存储过程的表是否有任何锁。
我正在使用 MS SQL Server 2012 和 Visual Studio 2013。
【问题讨论】:
-
是的,锁适用于桌子,你应该知道它的基本概念。如果有人插入或更新记录表将被锁定和解锁。最好的方法是像这样使用 select 语句:select * from table with(nolock).... 一旦数据被插入或更新,锁将被自动删除。
-
@Dirty,在我的过程中,我只使用“Select”语句”。所以你的意思是我必须像这样更改我的查询 - Select * from table with(nolock)
-
不要使用“with (nolock)”!它将允许您的程序在提交之前读取当前正在被正在进行的事务更新甚至删除的行(脏读)。
-
@sunil,使用 nolock 会给您一个好处,即它不会在其他人更新或插入新数据时锁定任何数据,缺点是您可能会读取脏数据。和我一样,我总是在我的项目中使用 nolock,因为我提供了优先插入、更新和删除。在您的情况下,您似乎必须决定您的数据包含什么?是否允许脏读数据?在您的情况下,唯一的缺点是用户会在数据表上锁定,其他用户必须等到锁定被释放。
-
@Dirty,感谢您的回答。我只是想问一下 whta 是“脏读数据”,这是否也适用于“选择”。意味着如果用户“A”正在使用我的程序,它有一些“选择”语句,并且用户“B”,“C”...等也同时使用我的程序,所以程序不应该阻塞/锁定任何表用于“选择”以及“插入、更新或删除”操作。
标签: c# sql-server stored-procedures sql-server-2012