Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 server 需要乐观并发的事务?_Sql Server_Optimistic Concurrency - Fatal编程技术网

Sql server 需要乐观并发的事务?

Sql server 需要乐观并发的事务?,sql-server,optimistic-concurrency,Sql Server,Optimistic Concurrency,在阅读这个问题时,有几次提到乐观并发在解决过程中由于事务中止而成本更高: 如果您执行的是单个update语句,通常您会创建where子句,以确保在冲突发生时不会进行更新。即,在where子句中包含原始行状态。如果其他人编辑了该行,并且存在冲突,则update语句将根据where子句只更新零条记录您不需要中止任何事务,因为您的更新未进行任何更改。您只需检查查询修改的行数(通常为一行或零行),如果查询修改了零行,则向用户提供解析决策 除非您有多个操作必须与更新一起是原子操作,否则我认为您不需要使用

在阅读这个问题时,有几次提到乐观并发在解决过程中由于事务中止而成本更高:

如果您执行的是单个update语句,通常您会创建where子句,以确保在冲突发生时不会进行更新。即,在where子句中包含原始行状态。如果其他人编辑了该行,并且存在冲突,则update语句将根据where子句只更新零条记录您不需要中止任何事务,因为您的更新未进行任何更改。您只需检查查询修改的行数(通常为一行或零行),如果查询修改了零行,则向用户提供解析决策

除非您有多个操作必须与更新一起是原子操作,否则我认为您不需要使用带有where子句的单个更新事务来支持乐观并发。但也许有一个细微差别,我错过了


您是否需要为单个update语句创建一个事务,该语句具有基于原始行状态选择的格式良好的where子句(用于乐观并发)?

通常,您不需要为任何单个DML语句创建一个事务(Insert、update、Delete)。每个单独的DML语句都是原子的。也就是说,它作为一个整体是成功还是失败。事务允许您将多个DML查询分组到单个原子工作单元中(以便它们作为一个组成功或失败)

话虽如此,我通常会使用事务更新。这样,更新模式在所有更新/保存中都是通用的,我不必担心我正在进行多少次更新(或者因为我添加了第二条update语句而记得添加事务)

说了这么多,我认为这并不是你问题的答案

大多数现代web应用程序的流程类似于:

  • 从数据库中获取数据并显示它
  • 让用户做他们自己的事情
  • 更新数据库
  • 第2步比其他两步要长得多。并发模型对这个流程没有帮助,因为您无法在步骤1中打开事务,并在步骤3中关闭它。那么,如何确保更新的数据与显示的数据相同呢。虽然格式良好的更新可能会阻止更新发生,但这只是问题的一部分,因为您还必须让用户知道他们的更新失败

    并发选项仅对步骤3中的处理有实际帮助。如果该过程如下所示:

  • 从数据库中读取数据
  • 检查数据是否已更改
  • 如果没有更改,请更新它
  • 将更改保存到数据库
  • 悲观并发保证数据在步骤1和步骤4之间不会发生更改;乐观并发并不能保证任何事情


    我想我是说,无论您是否有一个围绕单个update语句的事务,都不会影响乐观并发或悲观并发。应该使用选择的模型,但两种并发模型都需要处理数据更改。

    我有点迂腐,但我认为“乐观并发不能保证任何东西”有点强。它确实保证,如果在第1步和第4步之间,另一个用户同时进行了编辑,则会检测到该编辑。悲观:保证不会发生其他中间编辑;乐观:保证检测到中间编辑,并且二次编辑失败(需要显式解析)。感谢您确认我对交易角色的理解。您是对的,这比我预期的要强烈一些。只是,根据我的经验,并发模型在管理更新方面所起的作用比我们通常预期的要小。此外,评论中对悲观与乐观的定义也很好。