ACID并发ISOLATION LEVEL与ROWVERSION

时间:2015-11-16 13:25:35

标签: sql entity-framework concurrency sql-server-2012 acid

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

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

  1. SET TRANSACTION ISOLATION LEVEL [REPEATABLE READ | SERIALIZABLE | ...]
  2. 在表格上创建ROWVERSION列
  3. 据我所知,第一种方式使用数据库日志和锁,而第二种方法使用Rowversion值的基本比较。

    如果我所说的错误,请纠正我。

    最佳选择是什么?我应该同时使用它们还是坚持使用它们?

2 个答案:

答案 0 :(得分:0)

通常,每个dbcontext saveChanges()都是enclosed in a database transaction。我们正在谈论在不同级别处理并发:在saveChanges上的数据库事务和几个dbcontext saveChanges之间:

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

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

    •   

      配置实体框架,以在Update和Delete命令的Where子句中包含表中每列的原始值。   与第一个选项一样,如果行首次读取后行中的任何内容发生了更改,则Where子句不会返回要更新的行,实体框架会将其解释为并发冲突。对于具有许多列的数据库表,此方法可能会导致非常大的Where子句,并且可能要求您保持大量状态。

    •   

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

答案 1 :(得分:0)

SQL Server通过遵守ACID属性来维护数据完整性和系统稳定性,ACID属性是原子性,一致性,隔离性和持久性的首字母缩写。

此首字母缩略词的隔离部分指出所有事务都是彼此隔离运行的,并且没有两个资源可以同时更新SQL对象的相同数据或定义。在悲观的隔离级别(Read Uncommitted,Read Committed,Repeatable Read和Serialize-able)中,这是通过锁定来控制的。在乐观隔离级别(Read Committed Snapshot and Snapshot)中,这由行版本控制。

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