ACID并发隔离级别与ROWVERSION



我正在sql server 2012上测试并发性,并使用实体框架。

我注意到并发性主要可以通过以下方式控制:

  1. 设置事务隔离级别[可重复读取|可串行化|…]
  2. 在表上创建ROWVERSION列

据我所知,第一种方法使用数据库日志和锁,而第二种方法使用Rowversion值的基本比较。

如果我说的不对,请纠正我。

什么是最好的选择?我应该同时使用它们还是只使用其中一个?

通常,每个dbcontext saveChanges()都包含在一个数据库事务中。我们讨论的是处理不同级别的并发:在saveChanges上和几个dbcontext saveChanges:之间的数据库事务

  • 数据库层:数据库能够处理活动事务的隔离。您可以使用set transaction isolation level命令更改隔离级别。

  • 实体框架层:EF能够保持一个事务到另一个事务的并发性,只是为了知道其他用户是否更改了您的数据。有两种方式:

    • 将实体框架配置为在更新和删除命令的Where子句中包含表中每列的原始值。与第一个选项一样,如果自第一次读取该行以来,该行中的任何内容都发生了更改,则Where子句不会返回要更新的行,实体框架将其解释为并发冲突。对于具有多列的数据库表,这种方法可能会导致非常大的Where子句,并且可能需要维护大量的状态。

    • 在数据库表中,包括一个跟踪列,该列可用于确定行何时更改。然后,您可以将实体框架配置为在SQL Update或Delete命令的Where子句中包含该列。跟踪列的数据类型通常为rowversion

这就是MVC之旅:

db.Entry(departmentToUpdate).OriginalValues["RowVersion"] = rowVersion;

报价和详细信息:http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/handling-concurrency-with-the-entity-framework-in-an-asp-net-mvc-application

SQL Server通过遵守ACID属性来维护数据完整性和系统稳定性,ACID属性是Atomicity、Consistency、Isolation和Durability的缩写。

这个缩写词的隔离部分指出,所有事务都是在相互隔离的情况下运行的,没有两个资源可以同时更新SQL对象的相同数据或定义。在悲观隔离级别(Read Uncommitted、Read Committed、Repeatable Read和Serialize able)中,这是由锁定控制的。在乐观隔离级别(Read Committed Snapshot和Snapshot)中,这由行版本控制。

摘录自https://simonlearningsqlserver.wordpress.com/2013/11/15/locking-blocking-and-isolation-levels/

最新更新