首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MDriven ECO_ID重复

MDriven ECO_ID重复
EN

Stack Overflow用户
提问于 2021-12-04 08:57:01
回答 1查看 69关注 0票数 1

在MDriven为多个对象生成相同的ECO_ID时,我们似乎遇到了问题。在大多数情况下,它似乎与意外的进程关闭和/或服务器关闭一起发生,但它也发生在正常活动中。

我们的系统包括一个ASP.NET应用程序和一个WinForms应用程序。在IIS中设置ASP.NET应用程序以使用单个工作进程。我们混合了WebForms和MVC,包括ApiControllers。我们使用的是一个相当旧的ECO软件包: 7.0.0.10021。现在是VS 2017,目标框架是4.7.1。

我们将其配置为对对象id使用64位整数:s.数据库是Firebird。设置为使用ReadCommitted事务隔离。

据我所知,我们已经用EcoSpaceStrategyHandler配置了EcoSpaceStrategyHandler.SessionStateMode.Never,这意味着EcoSpaces根本不被重用,对吗?(为什么在这种情况下我甚至要使用EcoSpaceStrategyHandler,而不是通常使用new关键字创建EcoSpace?)

我们已经创建了用于所有控制器的MasterController : ControllerMasterApiController : ApiController类。它们具有一个EcoSpace属性,它只执行以下操作:

代码语言:javascript
复制
if (ecoSpace == null)
{
    if (ecoSpaceStrategyHandler == null)
        ecoSpaceStrategyHandler = new EcoSpaceStrategyHandler(
            EcoSpaceStrategyHandler.SessionStateMode.Never,
            typeof(DiamondsEcoSpace),
            null,
            false
        );
    ecoSpace = (DiamondsEcoSpace)ecoSpaceStrategyHandler.GetEcoSpace();
}
return ecoSpace;

也就是说,如果没有创建任何策略处理程序,则创建一个指定没有池和没有持续eco空间的会话状态的处理程序。然后,如果没有获取生态系统空间,那么从策略处理程序中获取一个。返回生态系统空间。这是否一个可以接受的方法?为什么要比简单地这样做更好呢?

代码语言:javascript
复制
if (ecoSpace = null)
    ecoSpace = new DiamondsEcoSpace();
return ecoSpace;

在aspx中,我们有一个具有EcoSpaceManager的母版页。它已被配置为使用池,但SessionStateModeNever。它将EnableViewState设置为true。这可以接受吗?这是否意味着EcoSpaces将在往返行程之间被池化,但不会激活?

我们有可能接连接收多个传入的API调用,因此在下一个API调用出现之前,还没有完成一个API调用。我假设这意味着MasterApiController的多个实例可以同时执行,但可以在单独的线程中执行。当然,也可能有执行MVC请求的MasterController实例,WinForms应用程序也可能运行一些批处理作业或其他。

但据我所知,id预订是在任何UpdateDatabase调用开始时进行的,其方式如下:

代码语言:javascript
复制
update "ECO_ID" set "BOLD_ID" = "BOLD_ID" + :N;
select "BOLD_ID" from "ECO_ID";

如果返回的值为K,这将保留N个新的id:s,范围从K到K-1。在任何地方使用ReadCommitted事务都应该确保更新锁定id数据行,迫使任何并发保存操作等待,然后在不受其他事务干扰的情况下获取更新结果,然后提交。此时,任何其他挂起的保存操作都可以进行它自己的id保留。我看不出这如何导致同一个ID被用于多个对象。

我应该注意,它似乎有时会在一个UpdateDatabase中生成id副本,也就是说,当保存一组新的相关对象时,它们中的一些最终会得到相同的id。不过,我还没有证实这一点。

有什么好主意吗?我该找什么?

EN

回答 1

Stack Overflow用户

发布于 2021-12-06 09:08:06

这个问题很可能是使用ReadCommitted隔离的。这允许两个系统同时启动一个事务,读取当前值,增加批处理,然后彼此保存。

您必须对键生成使用可序列化的隔离;(即只读取当前不在写操作中的内容)。

MDriven为隔离级别UpdateIsolationLevel和FetchIsolationLevel使用2种设置。

将UpdateIsolationLevel设置为可序列化

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70224259

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档