【问题标题】:ACID concurrency ISOLATION LEVEL vs ROWVERSIONACID 并发 ISOLATION LEVEL 与 ROWVERSION
【发布时间】:2015-11-16 13:25:34
【问题描述】:

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

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

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

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

如果我说的有问题,请纠正我。

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

【问题讨论】:

  • 我也有同样的问题...希望有人能给出更清晰的答案。没有不尊重@danihp,但我不清楚他们的答案。

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


【解决方案1】:

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

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

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

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

    • 在数据库表中,包含一个跟踪列,可用于确定行已更改的时间。然后,您可以配置实体框架以将该列包含在 SQL 更新或删除命令的 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

【讨论】:

    【解决方案2】:

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

    这个首字母缩略词的隔离部分表明所有事务都彼此隔离运行,没有两个资源可以同时更新相同的数据或 SQL 对象的定义。在悲观隔离级别(未提交读、已提交读、可重复读和可序列化)中,这是由锁定控制的。在乐观隔离级别(Read Committed Snapshot 和 Snapshot)中,这由行版本控制。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-31
      • 2015-04-26
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2023-03-28
      相关资源
      最近更新 更多