Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql ACID并发隔离级别与ROWVERSION_Sql_Entity Framework_Concurrency_Sql Server 2012_Acid - Fatal编程技术网

Sql ACID并发隔离级别与ROWVERSION

Sql ACID并发隔离级别与ROWVERSION,sql,entity-framework,concurrency,sql-server-2012,acid,Sql,Entity Framework,Concurrency,Sql Server 2012,Acid,我正在sql server 2012上测试并发性,并使用实体框架 我注意到并发主要可以通过以下方式之一进行控制: 设置事务隔离级别[可重复读取|可序列化|…] 在表上创建ROWVERSION列 据我所知,第一种方法使用数据库日志和锁,而第二种方法使用Rowversion值的基本比较 如果我说的是错的,请纠正我 最好的选择是什么?我应该同时使用它们还是只使用一个?通常,每个dbcontextsaveChanges()都是。我们讨论的是在不同级别上处理并发:在saveChanges上处理数据库事务,

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

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

  • 设置事务隔离级别[可重复读取|可序列化|…]
  • 在表上创建ROWVERSION列
  • 据我所知,第一种方法使用数据库日志和锁,而第二种方法使用Rowversion值的基本比较

    如果我说的是错的,请纠正我


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

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

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

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

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

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

    这是MVC的旅程:

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

    引号和详细信息:

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

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

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

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

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

    这是MVC的旅程:

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

    引用和详细信息:

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

    此首字母缩写词的隔离部分表示,所有事务都是彼此隔离运行的,没有两个资源可以同时更新SQL对象的相同数据或定义。在悲观隔离级别(readuncommitted、readcommitted、Repeatable和Serialize-able)中,这是由锁定控制的。在乐观隔离级别(读提交快照和快照)中,这由行版本控制控制


    摘自

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

    此首字母缩写词的隔离部分表示,所有事务都是彼此隔离运行的,没有两个资源可以同时更新SQL对象的相同数据或定义。在悲观隔离级别(readuncommitted、readcommitted、Repeatable和Serialize-able)中,这是由锁定控制的。在乐观隔离级别(读提交快照和快照)中,这由行版本控制控制


    摘自

    我有同样的问题。。。我希望有人能给出更清楚的答案。对@danihp没有不敬,但他们的答案我不清楚。我有同样的问题。。。我希望有人能给出更清楚的答案。没有对@danihp的不敬,但我不清楚他们的答案。