問題:
我在做sql的遠端資料傳輸時,用的是鏈結伺服器+儲存過程+分布式事務進行處理的,
但存在不穩定的問題.
兩台機器使用win2000server平台+sql7.0,用modem撥號做遠端連線.
具體做法如下,兩台sql的msdtc服務必須啟動,設兩台機器分別為資料中心a端、客戶端b
在a端設定連線伺服器b,b端設定鏈結伺服器a,為了保證資料傳輸的準確、安全、一至性,
使用了儲存過程和分布式事務(dts tran),具體的事務處理過程如下
set xact_abort on
begin distributed tran
----處理語句 從客戶端取資料寫入伺服器端
insert into [tables]
select * from [clinet].[dbo].[db].[tables]
----處理語句.....
commit tran
set xact_abort off
在具體實施中發現,有時事務無法啟動,提示說ole提供者不支援分布式事務,但我查了相關
文件,文件中明確指出ole for sql 的提供者支援分布式事務。
最後發現,兩台機器重啟後,第一次事務正常,有一台重啟後,再進行連線就會有導常,查了
相關的資料,好像有文章說到有「孤兒連線」的問題,說是計算機檔案處理及網路發現客戶端
已經斷開,會做一些處理,保證下一次的連線,而sql的連線由於連線速度慢,無法識別客戶端
的斷開,所以下次連線後事務無法正常啟動.
回答:1、本地和遠端都需要啟動
distributed transaction coordinator服務。
對於儲存過程,sql server 使用最初建立儲存過程時的 set ansi_nulls 設定值。無論隨後何時執行儲存過程,set ansi_nulls 的設定都還原為其最初使用的值並生效。當在儲存過程內喚醒呼叫 set ansi_nulls 時,其設定不更改。
在執行分布式查詢時應將 set ansi_nulls 設定為 on。
在執行分布式查詢時應將 ansi_warnings 設定為 on。
企業管理中的ansi_nulls和ansi_warnings選項不對,但沒有方法改動。在查詢分析器可以設定ansi_nulls和ansi_warnings選項,而且預設值是對的。所以能在查詢分析器建立此類儲存過程,而不能在企業管理器建立此類儲存過程。
就是:
create proc 名
as
set ansi_null_dflt_on on --注意
set ansi_warnings on
select * from open...
2、寫個儲存過程,使用微軟的 openrowset() or openquery() 函式,別搞什麼其他的冬冬,老老實實用基本的東西做就行了。這也是微軟內部推薦的連線方式
sql 分布式查詢
遠端鏈結伺服器機器名 roy 例項名 roy sql2005de 登陸名 sa 密碼 test2005 建立鏈結伺服器 exec master.dbo.sp addlinkedserver server n roy lnk srvproduct n provider n sqloledb datas...
SQL分布式查詢
測試檔案內容 e module test.xls job desc job id max lvl min lvl 記錄一 1.0 11.0 11.0 記錄二 2.0 22.0 22.0 記錄三 3.0 33.0 33.0 記錄四 4.0 44.0 44.0 e module temp.mdb檔案jo...
sql分布式查詢
建立鏈結伺服器 exec sp addlinkedserver itsv sqloledb 192.168.0.88 exec sp addlinkedsrvlogin itsv false null user emenudata2fortesting sa exec sp addlinkedser...