Architecture 死锁在两层体系结构或三层体系结构中更常见?为什么?

Architecture 死锁在两层体系结构或三层体系结构中更常见?为什么?,architecture,deadlock,dynamics-nav,dynamics-nav-2015,Architecture,Deadlock,Dynamics Nav,Dynamics Nav 2015,我使用的是Microsoft Navision 2009,很多时候,例如,如果您下了一个新订单,并在以后的记录中更改了一些内容,那么您经常会收到一条消息: 其他用户已更改记录,您无法对其执行任何操作 更改记录 因此,我们现在调查是否最好使用另一个版本的Navision。例如: 微软导航2013。因为2013使用了树级架构。和2009使用两层架构 所以我的问题是: 死锁在两层体系结构或三层体系结构中更常见?为什么?这是一个版本控制问题。也许Navision不适合您的需要。尝试另一个版本控制系统。该

我使用的是
Microsoft Navision 2009
,很多时候,例如,如果您下了一个新订单,并在以后的记录中更改了一些内容,那么您经常会收到一条消息:

其他用户已更改记录,您无法对其执行任何操作 更改记录

因此,我们现在调查是否最好使用另一个版本的Navision。例如:

微软导航2013
。因为
2013
使用了树级架构。和
2009
使用两层架构

所以我的问题是:


死锁在两层体系结构或三层体系结构中更常见?为什么?这是一个版本控制问题。也许Navision不适合您的需要。尝试另一个版本控制系统。

该错误提示与并发控制有关,而不是类似SQL的死锁(您开始对记录执行某些操作,另一个用户编辑同一记录,您尝试保存对修改记录的更改)

这与2层与3层体系结构无关,但处理方式如下:

  • 第一个保存更改成功(乐观、罕见冲突假设) 或
  • 首先进入编辑模式会阻止其他更改者的访问(悲观,经常冲突)

有关
Navision
中并发控制的更多详细信息,请参见(第7点)。看起来使用了乐观并发控制。

正如@alexei所说:这与2层或3层架构无关。而且这根本不是死锁

这种机制被称为“乐观锁定”,实际上是不锁定的。对于不可能由多人同时更改的实体,应使用乐观锁定设计程序。当两个人同时更改时,乐观锁定可防止第二个人在不知道更改的情况下覆盖第一个人的更改。所以这是件好事。它可以防止合并冲突。糟糕的是,第二个人必须重新加载数据,查看更改,并且必须再次进行自己的更改,或者决定现在不更改

悲观锁定另一方面是真正的资源锁定。人员为即将更改的实体设置锁。此人更改实体并释放锁。同时,没有其他人能够编辑锁定的实体。这里的优点是,第二个人不必再做这项工作,因为save永远不会失败。但它也有缺点:第二个人必须等待。用户在午餐时忘记解锁资源,甚至在度假时忘记解锁资源。因此,其他用户必须能够打破这些锁,或者程序必须在一段时间后打破它们

不锁定也是一种策略。如果你从零开始构建一些东西——没有某种框架,这是默认的。两个人都可以像使用乐观锁定一样同时编辑实体。然后第一个保存它。然后第二个保存它,并在不知道的情况下覆盖第一个更改。这也可以是一种策略,但在大多数商业案例中不是一种好策略


使用哪种锁定机制是应用程序设计的问题。或者,如果您的限制是使用其中一个,那么您必须设计应用程序,使其能够与之最佳配合。

正如其他答案中所述,这不是锁定问题,而是并发问题。在这种情况下,升级至Nav 2013将不会产生任何影响。更不用说Nav 2009是第一个引入三层功能的版本。所以您现在可以在和服务层中使用RTC


但同样,如果这个问题最近出现,可以假设您使用的是定制版的Nav应用程序,而不是纯Cronus。在这种情况下,您可能有一些经常更新订单的错误,比如定期更新odrer状态的作业。这样的作业可能每分钟执行一次,虽然用户对订单进行更改需要五分钟,但定期作业可能会更新订单五次。因此,仔细查看您的修改,确保它们不是问题所在

正如Alexey和pommes所说,从2层架构切换到3层架构不会改变SQL块/死锁

但是,如果我们更具体地谈论从NAV 2009迁移到NAV 2013,那么除了三层体系结构之外,还有其他一些变化,这些变化直接集中在SQL阻塞问题上

其中之一是重新设计销售和采购过帐例程,以显著缩短总账分录表锁定的时间:

另一个重要的变化是将用于悲观并发(锁表等)的隔离级别从可序列化转换为可重复读取。虽然也可以对2009年资产净值进行此更改,但在2013年资产净值中,这是默认选项。这种变化直接降低了阻塞/死锁的概率。您可以在此处阅读有关此更改的更多信息:

此外,整个数据访问堆栈被重写,所有与本机db兼容的代码被抛出。这允许优化SQL server(与本机DB体系结构相反),引入更有效的查询和数据缓存。虽然它不会直接影响块,但它意味着更快的数据操作,因此,锁的保留时间更短。


与背景发布的一些其他功能一起,这些更改可能导致NAV 2013在SQL锁方面比NAV 2009更有效

我认为该错误表明存在与并发相关的错误(“谁的更改成功”),与版本控制系统无关。好的,谢谢您的评论。但无论如何。