Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.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
C# C和SQL Server:多线程、连接和事务_C#_Sql Server_Multithreading_Transactions - Fatal编程技术网

C# C和SQL Server:多线程、连接和事务

C# C和SQL Server:多线程、连接和事务,c#,sql-server,multithreading,transactions,C#,Sql Server,Multithreading,Transactions,我在寻找一个棘手问题的解决办法 我和我的同事用C语言制作了一个“引擎”,它在SQL Server数据库上执行不同的详细说明 最初,这些详细说明包含在许多存储过程中,这些存储过程在夜间批处理中串联调用。这是一个有很多缺陷的系统 现在,我们已经从每个存储过程中提取了每个查询,听起来可能有些奇怪,我们已经将查询插入到数据库中 注意:原因是不同的,我不一一列举,但您只需要知道,出于业务原因,我们没有机会频繁发布软件。。。但是我们可以自由使用SQL脚本 我们引擎背后的逻辑主要是: 有几个阶段,称为顺序 每

我在寻找一个棘手问题的解决办法

我和我的同事用C语言制作了一个“引擎”,它在SQL Server数据库上执行不同的详细说明

最初,这些详细说明包含在许多存储过程中,这些存储过程在夜间批处理中串联调用。这是一个有很多缺陷的系统

现在,我们已经从每个存储过程中提取了每个查询,听起来可能有些奇怪,我们已经将查询插入到数据库中

注意:原因是不同的,我不一一列举,但您只需要知道,出于业务原因,我们没有机会频繁发布软件。。。但是我们可以自由使用SQL脚本

我们引擎背后的逻辑主要是:

有几个阶段,称为顺序 每个阶段包含几个步骤,然后细分为一组 该集合是一组步骤,将按顺序执行 除非另有规定,否则这些装置开始相互平行运行 默认情况下不属于任何集合的步骤将嵌入在运行时创建的集合中 启动前的集合可能需要等待一个或多个步骤的完成 步骤对应于要运行的原子或几乎SQL查询或C方法 在启动时,引擎查询数据库,然后组合阶段、步骤和集合以及相关配置。。。这将被执行 我们已经创建了引擎,我们有所有的配置。。。一切正常

然而,我们有一个需求:某些阶段必须有一个事务。即使该阶段的一个步骤失败,我们也需要回滚整个阶段

造成问题的是交易的管理

最初,我们为整个阶段创建了一个事务和连接,但我们很快意识到,由于多线程,这不是线程安全的

此外,经过几次测试,我们发现了有关该事务的异常。显然,当一个阶段包含许多步骤=许多数据库查询时,同一事务无法执行任何进一步的语句

现在,我们做了一个更改,确保在需要事务的阶段中的每个步骤都会打开一个连接和一个事务,如果一切顺利,所有提交都会回滚

它起作用了。但是,我们注意到了一个限制:使用临时表

在事务阶段,当我在步骤x中创建临时临时临时表TENTABLE1时,我无法在下一步中使用TENTABLE1,即从TENTABLE1中选择TOP 1

这是合乎逻辑的:因为它是一个单独的事务,并且在执行实例结束时删除了Attendable1

然后我们尝试使用全局临时表2,但是在步骤y中,SELECT的执行被阻止,直到超时时间过去

我还尝试降低事务隔离级别,但什么都没有

现在我们处于一个不幸的境地,不得不创建真正的表,而不是使用临时表


我正在寻找在大量步骤上使用事务和使用临时表之间的折衷方案。我相信演讲的重点是交易管理。建议?

您可以使用UID作为与过渡数据关联的事务ID,这样您就可以从transtable中获取select stuff,其中UID={mytrans},并允许许多事务同时发生。。。只是一个想法,但是您是否尝试过使用经常被称为临时表或临时表的实际表?它们可以永久存在于db中,也可以是瞬态的。真的没关系。关键是,它们是具体化的,在任何时候都可以被所有/任何查询访问。在我的生产系统中,我通常在完成时删除它们,以保持模式干净。@BugFinder我不知道该怎么做this@pim是的,这很复杂但很必要。。。但我不喜欢你的方法,对我来说有点脏。问题是多线程、事务和临时表能否协同工作?@Gioce90这是许多ETL工作负载的一个非常常见的解决方案,因此我不确定您的偏见来自何方。此外,我认为在没有实际尝试的情况下对解决方案进行假设是不正确的。物理表将被写入实际数据文件而不是tempdb,这将为您带来性能优势,最重要的是解决您的问题。我会高度考虑把你的个人的、毫无根据的偏见放在一边,然后付诸行动。