在SQL Server中的事务中运行更新时,从表中选择数据

时间:2018-08-12 11:00:51

标签: .net sql-server transactions locking

以下sql查询用于更新事务中的特定行。

BEGIN TRANSACTION;  

Update [dbo].[StudentExamAttendanceDetails]   SET StudentFeedBack = 1 Where Id = 4883174

COMMIT TRANSACTION;

问题是直到提交事务后,整个表仍处于锁定状态。因此,我无法同时从同一张表中选择任何数据。

出于测试目的,我跳过了COMMIT TRANSACTION;部分运行了查询的以下部分:

BEGIN TRANSACTION;  

Update [dbo].[StudentExamAttendanceDetails]   SET StudentFeedBack = 1 Where Id = 4883174

与此同时,我运行了选择查询。由于整个表被锁定,因此选择查询无法选择任何数据。当我运行提交代码时: COMMIT TRANSACTION;在更新查询上,然后选择查询起作用。但是我试图在尚未提交更新事务时运行选择查询。这意味着我只想锁定要更新的行,而不是整个表。 所以我尝试了两种方法:

1. GO  
   SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; 

2. Update [dbo].[StudentExamAttendanceDetails] With(RowLock)  SET StudentFeedBack = 1 
   Where Id = 4883174

但是这些方法都不起作用。整个表仍处于锁定状态,在提交事务之前,我无法从表中选择任何数据。

1 个答案:

答案 0 :(得分:0)

使用

只是为了确保您正确获得它
GO SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

WITH (NOLOCK)

与select语句有关,而不与更新有关。使用事务将导致整个表或所选行的锁定,具体取决于索引的存在。尝试确保正在运行的读取脚本中使用了WITH(NOLOCK)。