在MS SQL中是UPDATE命令线程安全(跟踪修订)

时间:2016-01-24 11:24:25

标签: sql entity-framework tsql entity-framework-6

假设我们有一个博客工具,每次用户对文章(Id,正文,修订版)进行修改时,修订计数器会增加1.如果我们执行以下查询(在MS SQL中),假设我们有很多人试图更新文章,那么我们会得到“正确的”修订吗?

由于我使用的是EF,因此我以下列方式表达了查询:

context.Database.ExecuteSqlCommand("UPDATE dbo.Articles SET Revisions = Revisions + 1 WHERE Id=@p0;", articleId);

注意:'正确'修订的含义是,如果我们有100人同时更新文章,一旦完成,修订将是设置为 100

1 个答案:

答案 0 :(得分:3)

是的,这是线程安全的。数据库引擎将在更新期间锁定记录,这意味着任何其他线程都必须等待它完成更新。

在此期间,该字段确实会增加1,而不会受到其他线程的干扰。完成后,资源将被解锁,下一个等待的线程将依次锁定它,并执行相同的操作。

正如docs中所解释的那样,锁是一个独有的锁:

  

独占(X)用于数据修改操作,例如INSERT,UPDATE或DELETE。确保无法同时对同一资源进行多次更新。

  

独家锁定
  独占(X)锁防止并发事务访问资源。没有其他事务可以读取或修改使用独占(X)锁定锁定的数据。