实时异常处理,SQL-Server驱动的系统

时间:2010-07-13 22:10:12

标签: sql-server architecture fault-tolerance

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

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

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

我不确定两个数据库之间的差异,它们可能针对不同的目标进行了调整,或者两个数据库可能存在一些财务或政治原因。

无论如何,提到的术语是报告数据库在主数据库上“依赖于事务”。这到底是什么意思?报告数据库完全取决于数据库A的事务?这让我想到了一些问题:

1)我如何处理报告数据库没有磁盘空间但数据库A仍然触发报告数据库的情况?排队是否好 2)链接到上面,如果我将触发器排队并且它们的数据无法触发到报告数据库(不确定如何,但在概念上......),它是否会起作用?即使这样,这也使得系统不是实时的。

在这样的设置中,异常处理还有其他危险/问题吗?

由于

2 个答案:

答案 0 :(得分:1)

这种依赖在生产中实际上非常糟糕。对于一次,触发器和更新(远程)数据库肯定会杀死性能。但更重要的是可用性问题。依赖于数据库A的应用程序现在与数据库B的可用性相关联,因为如果数据库B不可用,则触发器工作器执行其工作,它将失败并且应用程序将遇到错误。因此,现在数据库B的amdinsitrator与使用数据库A的应用程序的操作挂钩。

这个问题有很多方法,最简单的方法是从数据库A中的发布部署数据库B中的订阅来部署事务复制。这从事务角度隔离了两个数据库,允许应用程序依赖于数据库A,当数据库B不可用时,或者只是缓慢的时候不受影响。

答案 1 :(得分:0)

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

此方案有正当理由,但它确实会在报表数据库中创建事务数据库的依赖关系,因为如果报表数据库关闭,则事务数据库实际上变为只读或更糟。

这不是你想要的。

如果您的数据库具有相同的结构,则可以查看复制。通常情况下,当我想到报告数据库时,我正在考虑针对报告优化的不同结构的东西,而不仅仅是出于性能原因而隔离的数据的另一个副本(这很好,但这基本上只是简单地抛出硬件)停止报告用户伤害交易用户的问题。)