SQL Server 复制在所有已发布的表中是否在事务上“安全”?

Dan*_*lan 4 replication sql-server transaction

我们有一个系统,它的一个数据源仍然在 SQL Server 2000 上。为了实现更高的可用性,我们希望设置从这台 2000 服务器到 2008 集群的事务复制。

我的问题是,INSERT/UPDATE/DELETE所有已发布表中源数据库上的语句是否保证在事务上是安全的(顾名思义)?例如,如果我对源数据库执行以下查询:

BEGIN TRAN
INSERT  t1  (mycol) VALUES  ( 0 )
INSERT  t2  (mycol) VALUES  ( 1 )
COMMIT TRAN
Run Code Online (Sandbox Code Playgroud)

假设t1t2是同一出版物的一部分,对目的地的以下查询是否总是产生以下结果?

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
Run Code Online (Sandbox Code Playgroud)

结果:

Value in t1: 0
Value in t2: 1
Run Code Online (Sandbox Code Playgroud)

Ric*_*ard 6

嗯,有三种不同类型的复制,但它们在一定程度上都是事务安全的。

SQL Server 中有三种类型的复制:事务复制、合并复制和快照复制。

事务复制

这种类型的复制将 master 中发生的每个修改传输到每个订阅数据库。这种类型的复制确保您将在主系统上发生(或多或少)更改时获得每个更改。

这将像您描述的那样执行。但是,将复制从主数据库移动到订阅服务器数据库时可能(将)有时间延迟。

合并复制

这种类型的复制本质上是事务复制,但它允许冲突。(显然,还有更多内容,但这就是本质。)

因此,就像事务复制一样,您将在每个订阅者发生变化时获取数据(加上一点时间延迟)。

快照复制

这与前两个不同之处在于数据库不会复制单个更改。相反,它会定期拍摄快照并发送快照。

这是事务安全的,因为您只会看到已完成的事务被复制到订阅者。但是,您不会实时(或类似实时)看到这一点。


因此,是的,复制在事务上是安全的,因为您只会看到已完成的事务。任何部分或回滚的事务都不会应用于订阅者数据库。

但是,它们在事务上并不安全,因为复制不能在数据库之间保持完美的一致性。(因此破坏了 ACIDity 和事务。)为此,您将需要分布式事务(这是一个完全不同的概念)。