台灣最大程式設計社群網站
線上人數
1476
 
會員總數:246133
討論主題:189712
歡迎您免費加入會員
討論區列表 >> MS SQL >> 為何我利用分散式跨資料庫交易還是失敗呢?
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
為何我利用分散式跨資料庫交易還是失敗呢?
價值 : 100 QP  點閱數:21120 回應數:5
樓主

小凡
初學者
190 40
924 118
發送站內信

捐贈 VP 給 小凡
請教前輩們,

我有二台SQL SERVER,

若不用BeginTransaction,

即可正常跨資料庫insert或update ,

為保持資料的正確性,

所以在.NET下BeginTransaction,

但出現了以下的錯誤,




後來我改成用參考了這些文章
http://www.blueshop.com.tw/board/show.asp?subcde=BRD20060308012046AKI&fumcde=FUM20041006152735ZFS&rplcnt=3
http://www.blueshop.com.tw/board/show.asp?subcde=BRD20070514102803Q7F&fumcde=FUM20041006152735ZFS&rplcnt=16
所以改用BEGIN DISTRIBUTED TRAN來做







但改成BEGIN DISTRIBUTED TRAN發生另外的問題







因此去找了相關的文章如下
1.這篇文章http://blogs.msdn.com/mab/archive/2005/12/30/508273.aspx內的連結http://support.microsoft.com/?kbid=873160
2.http://forums.microsoft.com/TechNet-CHT/ShowPost.aspx?PostID=1026321&SiteID=23


設定完後還是發生了如下的問題




小弟以做完如下的設定
1.MS DTC都已經啟動了
2.在 [ 執行 ] 對話方塊, 輸入 Services.msc ,分散式交易協調器是running的,設定為"網路服務"。
3.沒有開防火牆,但一樣照個文章把msdtc及port:135加入防火牆的例外中
4.SQL語法也改成了如下的寫法






請問我該如何try這個問題呢? 請各位前輩大大們指導一下
謝謝






本篇文章發表於2008-03-21 09:27
1樓
回應

純真的人
捐贈 VP 給 純真的人 檢舉此回應
要有帳號及密碼驗證權限吧?!..

不然那個MSSQL有那麼簡單就只有IP位置,就是被新增@@"""

--Oracle
--SELECT * FROM OPENDATASOURCE('MSDAORA','Data Source =x.x.x.x;User ID=admin;Password=1234')..資料庫名稱.資料表名稱

--MSSQL
SELECT * FROM OPENDATASOURCE('SQLOLEDB','Data Source =x.x.x.x;User ID=admin;Password=1234').資料庫名稱.dbo.資料表名稱


如果出現以下的錯誤訊息,請到介面組態→功能的介面組態的第一項打勾即可使用~

SQL Server 已封鎖元件 'Ad Hoc Distributed Queries' 的 STATEMENT 'OpenRowset/OpenDatasource' 之存取,因為此元件已經由此伺服器的安全性組態關閉。系統管理員可以使用 sp_configure 來啟用 'Ad Hoc Distributed Queries' 的使用。如需有關啟用 'Ad Hoc Distributed Queries' 的詳細資訊,請參閱《SQL Server 線上叢書》中的<介面區組態>(Surface Area Configuration)。
本篇文章回覆於2008-03-21 12:03
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

小凡
捐贈 VP 給 小凡 檢舉此回應
謝謝"純真的人"前輩回覆...
我在A DB的物件伺服器中已經設了B DB的連結伺服器(帳號密碼也在那邊設了)

敝人文章有提到:
若不用BeginTransaction,
即可正常跨資料庫insert或update,
這代表遠端新增修改是沒問題的...

但如果加了BEGIN TRAN or BEGIN DISTRIBUTED TRAN就會發生問題...
不過您說的我還是照做了一次...
結果還是一樣不行囉 >"<

請各位前輩指引小弟一下呀
感激不盡哩






本篇文章回覆於2008-03-21 12:59
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

純真的人
捐贈 VP 給 純真的人 檢舉此回應
剛剛去測試一下...

若單獨這樣
SELECT * FROM OPENDATASOURCE('SQLOLEDB','Data Source =x.x.x.x;User ID=admin;Password=1234').資料庫名稱.dbo.資料表名稱

是ok的...

但加了...
BEGIN DISTRIBUTED TRAN;
SELECT * FROM OPENDATASOURCE('SQLOLEDB','Data Source =x.x.x.x;User ID=admin;Password=1234').資料庫名稱.dbo.資料表名稱
COMMIT TRAN;

出現這個...暫找不出原因@@a

連結伺服器 "(null)" 的 OLE DB 提供者 "SQLNCLI" 傳回訊息 "協力電腦異動管理員已經停用了對遠端/網路異動的支援。"。
訊息 7391,層級 16,狀態 2,行 2
無法執行作業,因為連結伺服器 "(null)" 的 OLE DB 提供者 "SQLNCLI" 無法開始分散式交易。

但若本機查詢就ok...
BEGIN DISTRIBUTED TRAN;
SELECT * FROM 資料表
COMMIT TRAN;
本篇文章回覆於2008-03-21 14:01
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

小凡
捐贈 VP 給 小凡 檢舉此回應
回"純真的人"前輩...
請問您的MS DTC有通嗎?
可以測試一下喔
http://support.microsoft.com/kb/306843/zh-tw (立即下載 DTCPing.exe)
我這邊RPC DTC是Success的了...

ADO.NET2.0有提供EnlistTransaction (EnlistDistributedTransaction)方法...
不曉得能不能解決 還在測試中...


請各位大大指導小弟一下...感激不盡
謝謝



本篇文章回覆於2008-03-21 15:41
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
回應

純真的人
捐贈 VP 給 純真的人 檢舉此回應
嗯...可惜不能隨便裝DTCPing.exe軟體來測@@"..

ps.另一台控制權不是我的@@"
本篇文章回覆於2008-03-24 14:25
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.