假设我们有一个博客工具,每次用户对文章(Id,正文,修订版)进行修改时,修订计数器会增加1.如果我们执行以下查询(在MS SQL中),假设我们有很多人试图更新文章,那么我们会得到“正确的”修订吗?
由于我使用的是EF,因此我以下列方式表达了查询:
context.Database.ExecuteSqlCommand("UPDATE dbo.Articles SET Revisions = Revisions + 1 WHERE Id=@p0;", articleId);
注意:'正确'修订的含义是,如果我们有100人同时更新文章,一旦完成,修订将是设置为 100 。
答案 0 :(得分:3)
是的,这是线程安全的。数据库引擎将在更新期间锁定记录,这意味着任何其他线程都必须等待它完成更新。
在此期间,该字段确实会增加1,而不会受到其他线程的干扰。完成后,资源将被解锁,下一个等待的线程将依次锁定它,并执行相同的操作。
正如docs中所解释的那样,锁是一个独有的锁:
独占(X)用于数据修改操作,例如INSERT,UPDATE或DELETE。确保无法同时对同一资源进行多次更新。
和
独家锁定
独占(X)锁防止并发事务访问资源。没有其他事务可以读取或修改使用独占(X)锁定锁定的数据。