Sql server SQL Server驱动的实时系统中的异常处理

Sql server SQL Server驱动的实时系统中的异常处理,sql-server,architecture,fault-tolerance,Sql Server,Architecture,Fault Tolerance,我在.NET Winforms中开发了一个报表查看器(它只运行查询和显示结果) 这适用于报告数据库。但是,上面的代码是一个更大的应用程序的一小部分,它从另一个数据库获取数据。看起来是这样的: 受监控系统的状态发生变化(例如延迟增加)=>事件作为事务记录到SQL Server数据库中(称此数据库为a)=>这将触发触发器将相同事件写入报告数据库 我不确定这两个数据库之间的区别,它们可能是针对不同的目标进行调整的,或者这两个数据库可能有一些财务甚至政治原因 无论如何,有人提到,报告数据库在事务上依赖于

我在.NET Winforms中开发了一个报表查看器(它只运行查询和显示结果)

这适用于报告数据库。但是,上面的代码是一个更大的应用程序的一小部分,它从另一个数据库获取数据。看起来是这样的:

受监控系统的状态发生变化(例如延迟增加)=>事件作为事务记录到SQL Server数据库中(称此数据库为a)=>这将触发触发器将相同事件写入报告数据库

我不确定这两个数据库之间的区别,它们可能是针对不同的目标进行调整的,或者这两个数据库可能有一些财务甚至政治原因

无论如何,有人提到,报告数据库在事务上依赖于主数据库。这到底意味着什么?报告数据库完全依赖于数据库A的事务?这让我想到了一些问题:

1) 如何处理报告数据库没有磁盘空间,但数据库A仍在向报告数据库触发触发器的情况?排队好吗 2) 与上述内容相关联的是,如果我将触发器及其数据排入队列,而无法将其发送到报告数据库(不确定如何发送,但在概念上……)中,它会起作用吗?即使如此,这也使得系统不是实时的

在这样的设置中,异常处理是否存在其他危险/问题


谢谢

这种依赖性在生产中实际上非常糟糕。这一次,触发器和更新(远程)数据库肯定会扼杀性能。但更重要的是可用性问题。依赖于数据库A的应用程序现在与数据库B的可用性联系在一起,因为如果数据库B不可用,那么触发器将执行其工作,它将失败,应用程序将出错。因此,righ现在数据库B的amdInstitrator已挂起,用于使用数据库A的应用程序的操作


解决此问题的方法有很多,最简单的方法是从数据库a中的发布部署事务性复制,并在数据库B中进行订阅。这从事务的角度将两个数据库隔离开来,允许依赖于数据库a的应用程序在数据库B不可用时不中断运行,或者只是慢一点。

如果系统必须是实时的,那么触发器是唯一的方法。请注意,触发器是完全同步的-报告数据库上的操作必须成功完成,否则触发器将失败,然后您很可能会失败事务数据库上的操作,因为它在触发器中,原始表上的语句将失败,这可能会被捕获,也可能不会被捕获,但无论如何,对事务数据库中该表的更改都不会发生

这种情况有充分的理由,但它确实会创建事务数据库对报告数据库的依赖关系,因为如果报告数据库关闭,事务数据库实际上会变成只读或更糟

那不是你真正想要的

如果数据库具有相同的结构,则可以查看复制。通常,当我想到一个报表数据库时,我想到的是一个具有不同结构的数据库,它针对报表进行了优化,而不仅仅是出于性能原因而隔离的数据的另一个副本(这很好,但这基本上只是简单地向问题扔硬件,以停止报表用户伤害事务用户)