我在sql server 2012上测试并发性并使用实体框架。
我注意到并发可以主要通过以下方式之一来控制:
据我所知,第一种方式使用数据库日志和锁,而第二种方法使用Rowversion值的基本比较。
如果我所说的错误,请纠正我。
最佳选择是什么?我应该同时使用它们还是坚持使用它们?
答案 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;
答案 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/