Sql-Server

SQL Server 複製是否跨所有已發布表在事務上“安全”?

  • August 14, 2015

我們有一個系統,它的其中一個數據源仍在 SQL Server 2000 上。為了實現更高的可用性,我們希望設置從這台 2000 伺服器到 2008 集群的事務複製。

我的問題是,INSERT/UPDATE/DELETE所有已發布表中的源數據庫上的語句是否保證在事務上是安全的(顧名思義)?例如,如果我對源數據庫執行以下查詢:

BEGIN TRAN
INSERT  t1  (mycol) VALUES  ( 0 )
INSERT  t2  (mycol) VALUES  ( 1 )
COMMIT TRAN

假設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

結果:

Value in t1: 0
Value in t2: 1

嗯,有三種不同類型的複制,但它們在一定程度上都是事務安全的。

SQL Server 中有三種類型的複制:事務複製、合併複製和快照複製。

事務複製

這種類型的複制將主數據庫中發生的每個修改傳輸到每個訂閱數據庫。這種類型的複制可確保您在主系統上發生(或多或少)每次更改。

這將像您描述的那樣執行。但是,在將複製從主數據庫移動到訂戶數據庫時,可能(將會)有時間延遲。

合併複製

這種類型的複製本質上是事務複製,但它允許衝突。(顯然,它的意義遠不止於此,但這就是本質。)

因此,就像事務複製一樣,您將在每個訂閱者更改時獲取數據(加上一點時間延遲)。

快照複製

這與前兩個不同,因為數據庫不複製單個更改。相反,它會定期拍攝快照並發送快照。

這在事務上是安全的,因為您只會看到已完成的事務被複製到訂閱者。但是,您不會實時(或類似實時)看到這一點。


所以,是的,複製在事務上是安全的,因為您只會看到已完成的事務。任何部分或回滾的事務都不會應用於訂閱者數據庫。

但是,它們在事務上不是安全的,因為複制不能保持數據庫之間的完美一致性。(從而破壞 ACIDity 和事務。)為此,您將需要分佈式事務(這是一個完全不同的概念)。

引用自:https://dba.stackexchange.com/questions/4989