我正在与Microsoft Navision 2009
合作,很多时候,如果你做了一个新的订单,并且稍后在记录上做了更改,那么经常会发生一条消息:
另一位用户更改了记录,你无法做任何事情 改变记录。
因此,我们现在调查是否更适合使用其他版本的Navision。例如:
Micrososft Navision 2013
。因为2013
使用了树层体系结构。 2009
使用双层架构。
所以我的问题是:
在双层体系结构或三层体系结构中更常出现死锁?为什么?
答案 0 :(得分:2)
错误提示与并发控制相关的内容而不是像死锁一样的SQL(您开始在记录上执行某些操作,另一个用户编辑相同的记录,并尝试将更改保存在已修改的内容中)。
这与2对3层架构无关,但处理concurrency control的方式:
有关Navision
中并发控制的更多详细信息,请参见here(第7点)。看起来好像使用了乐观并发控制。
答案 1 :(得分:2)
正如Alexey和pommes所说,从2层到3层架构的转换在SQL块/死锁方面没有任何改变。
但是,如果我们更具体地讨论从NAV 2009迁移到NAV 2013,除了3层架构之外还有其他一些变化,它们直接关注SQL阻塞问题。
其中之一是重新设计销售和采购过帐例程,以显着减少G / L Entry表被锁定的时间段: https://blogs.msdn.microsoft.com/nav/2012/10/17/gl-entry-table-locking-redesign-in-microsoft-dynamics-nav-2013/
另一个重要的变化是将用于悲观并发(LOCKTABLE等)的隔离级别从SERIALIZABLE切换到REPEATABLE READ。虽然也可以对NAV 2009进行此更改,但在NAV 2013中,它是默认选项。此更改直接降低了阻塞/死锁的可能性。您可以在此处详细了解此更改: https://blogs.msdn.microsoft.com/nav/2011/05/12/microsoft-dynamics-nav-changes-by-version/
除此之外,整个数据访问堆栈被重写,并且所有与native-db兼容的代码都被抛弃了。这允许优化SQL服务器(而不是本机数据库体系结构),引入更有效的查询和数据缓存。虽然它不会直接影响块,但它意味着更快的数据操作,因此,锁可以保持更少的时间。 https://msdn.microsoft.com/en-us/library/hh169480(v=nav.70).aspx
与背景发布的其他一些功能一起,与NAV 2009相比,这些更改可能会导致NAV 2013在SQL锁定方面更有效。
答案 2 :(得分:1)
正如在其他答案中所说,这不是锁定问题,这是并发问题。在这种情况下,升级到Nav 2013将不会产生任何影响。更不用说Nav 2009是第一个引入3层功能的版本。所以你现在可以使用RTC和服务层。
但话又说回来,如果最近出现这个问题,可以假设您使用的是为您的Nav应用程序而不是纯Cronus定制的。在这种情况下,您可能会遇到一些经常更新订单的错误,例如定期更新odrer状态的工作。像这样的工作可以每分钟执行一次,而用户需要五分钟来对订单进行更改,订单可以通过定期工作更新五次。因此,仔细查看您的修改并确保它们不是问题所在。
答案 3 :(得分:0)
正如@alexei所说:这与2层或3层架构无关。它根本不是死锁。
该机制称为乐观锁定 - 实际上没有锁定。程序应该使用乐观锁定来设计,这些实体不可能同时由多个人更改。当2个人同时更改它时,乐观锁定可防止第二个人在不知道更改的情况下覆盖第一个人。所以这是一件好事。它可以防止合并冲突。不好的是,第二个人必须重新加载数据,看到更改并且必须再次进行自己的更改 - 或者决定不立即更改。
另一方面的悲观锁定是对资源的真正锁定。一个人为即将被更改的实体设置锁定。此人更改实体并释放锁定。在此期间,没有其他人能够编辑被锁定的实体。这里的优点是第二个人永远不必再做工作,因为保存永远不会失败。但它也有缺点:第二个人必须等待。用户在午餐时忘记解锁他们的资源,甚至在他们去度假时更糟糕。所以其他用户必须能够打破这些锁,否则程序必须在一段时间后打破它们。
无锁定也是一种策略。如果你从头开始构建一些东西 - 没有某种框架,这是默认的。两个人可以同时编辑实体,就像他们乐观锁定一样。然后第一个保存它。然后第二个保存它并在不知情的情况下覆盖第一个更改。这也可以是一种策略,但在大多数商业案例中并不是一个好的策略。
这是一个关于你的应用程序设计的问题,使用哪种锁定机制。或者,如果你的约束是使用其中一个,你必须设计你的应用程序,以便它最适合它。
答案 4 :(得分:-2)
这是修订控制问题。也许Navision不适合您的需求。尝试其他版本控制系统。