2016-01-24 115 views
1

假设我们有一个博客工具,每当用户对文章(Id,正文,修订版)执行修改时,修订计数器就会增加1。如果我们要执行以下查询(在MS SQL中),并且假设我们有很多人试图更新文章,那么我们会得到'正确的'修订MS SQL中的UPDATE命令线程安全(跟踪修订版)

由于我使用的是EF,我都表示通过以下方式查询:

context.Database.ExecuteSqlCommand("UPDATE dbo.Articles SET Revisions = Revisions + 1 WHERE [email protected];", articleId); 

注:我的意思是“正确的” 修订是什么,如果我们将有100人更新同时,一旦它们全部完成,修订版将被设置为。

回答

3

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

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

docs解释的,锁是独占一个:

互斥(X)用于数据修改操作,例如插入,更新或删除。确保不能同时对同一资源进行多个更新。

和:

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

+0

谢谢你的回答! – Artem