如何在单个查询完成执行之前锁定事务以防止出现死锁错误

Posted

技术标签:

【中文标题】如何在单个查询完成执行之前锁定事务以防止出现死锁错误【英文标题】:How to lock the transaction untill single query completes its execution for not getting deadlock error 【发布时间】:2016-04-28 07:44:43 【问题描述】:

我对以下代码有疑问。

Update Statement on Table 1

Update Statement on Table 2

Select Statement which include both the Table 1 

现在上面的代码将返回到应用程序。意味着它是获取应用程序的所有功能。

我在应用程序中经常遇到死锁错误。

我有数百个用户一次获取同一张表。 所以我必须确保在更新语句完成之前选择语句不会触发或如何锁定更新语句。

还有一个疑问,如果假设我正在更新一行并且另一位用户尝试选择该表,那么他是否会陷入死锁。 (用户试图选择不在更新语句中的另一行。) 这种情况会发生什么。

请帮帮我。

提前致谢

【问题讨论】:

【参考方案1】:

你应该使用事务,

    BEGIN TRANSACTION [Tran1]

    BEGIN TRY

    Update Statement on Table 1
    Update Statement on Table 2
    Select Statement which include both the Table 1     

    COMMIT TRANSACTION [Tran1]

    END TRY
    BEGIN CATCH
      ROLLBACK TRANSACTION [Tran1]
    END CATCH  

    GO

如果您不希望任何人更新/删除该行,我会在 SELECT 语句中使用 UPDLOCK。这表明您将很快更新同一行,例如

select @Bar = Bar from oFoo WITH (UPDLOCK) where Foo = @Foo;

【讨论】:

如果我使用 try catch 块,那么只有在更新语句完成后才会触发 select ???

以上是关于如何在单个查询完成执行之前锁定事务以防止出现死锁错误的主要内容,如果未能解决你的问题,请参考以下文章

通过防止在进程中查询来避免 SSAS 中的死锁

事务 - 如何避免死锁?

使用Sqlserver更新锁防止数据脏读

使用数据库事务防止竞争条件 (Laravel)

Microsoft SQL Server中的事务与并发详解

SQL nolock 和 join