我们有一个系统,其数据源之一仍在 SQL Server 2000 上。为了实现更高的可用性,我们希望设置从这台 2000 服务器到 2008 集群的事务复制。
我的问题是,INSERT/UPDATE/DELETE
所有已发布表中源数据库上的语句是否保证事务安全(顾名思义)?例如,如果我在源数据库上执行以下查询:
BEGIN TRAN
INSERT t1 (mycol) VALUES ( 0 )
INSERT t2 (mycol) VALUES ( 1 )
COMMIT TRAN
假设t1
和t2
是同一出版物的一部分,以下对目的地的查询是否总是会产生以下结果?
SET TRANSACTION ISOLATION LEVEL SNAPSHOT
BEGIN TRAN
SELECT 'Value in t1: ' + CAST(t1.mycol AS VARCHAR(10)) from t1
SELECT 'Value in t2: ' + CAST(t2.mycol AS VARCHAR(10)) from t2
COMMIT
结果:
Value in t1: 0
Value in t2: 1
好吧,有三种不同类型的复制,但它们在一定程度上都是事务安全的。
SQL Server 中有三种复制类型:事务复制、合并复制和快照复制。
事务复制
这种类型的复制将主数据库中发生的每个修改传输到每个订阅数据库。这种类型的复制确保您将在主系统上(或多或少)发生每个更改。
这将像您描述的那样执行。但是,当复制从主数据库移动到订阅者数据库时,可能(将会)有时间延迟。
合并复制
这种类型的复制本质上是事务复制,但它允许冲突。(显然,它的内容远不止于此,但这就是本质。)
因此,就像事务复制一样,您将在每个订阅者发生变化时获取其数据(加上一点时间滞后)。
快照复制
这与前两者的不同之处在于数据库不会复制单个更改。相反,它会定期拍摄快照并向下发送快照。
这在事务上是安全的,因为您只会看到已完成的事务被复制到订阅者。但是,您不会实时(或类似实时的任何内容)看到这一点。
所以,是的,复制在事务上是安全的,因为您只会看到已完成的事务。任何部分或回滚的事务都不会应用于订阅者数据库。
但是,它们在事务上并不安全,因为复制不能保持数据库之间的完美一致性。(从而破坏 ACIDity,从而破坏事务。)为此,您将需要分布式事务(这是一个完全不同的概念)。