首先先要對SQL Server dtc 配置
打開“控制面板―管理工具―組件服務”(或者運行“Dcomcnfg.exe”) 打開“組件服務―計算機” 在“我的電腦”上點擊右鍵,點擊“屬性” 在MSDTC選項卡中,點擊“安全配置”按鈕。
操作如下:
SET XACT_ABORT ON 的設置
當爲ON時,如果你存儲中的某個地方出了問題,整個事務中的語句都會回滾爲OFF時,只回滾錯誤的地方
跨庫操作:
- exec sp_addlinkedserver 'server_link','','SQLOLEDB','192.168.1.82' --創建服務器
- exec sp_addlinkedsrvlogin 'server_link','false',null,'sa','a@1'--設置服務器鏈接
- exec sp_serveroption 'server_link','rpc out','true' --這個允許調用鏈接服務器上的存儲過程
- go
- exec sp_helpserver--查詢服務器
- exec sp_dropserver 'server_link','droplogins'--刪除服務器
- select * from server_link.UCenter.dbo.Site
- select * from server_link.UCenter.dbo.Member
- --臨時創建跨服務器
- select * from OPENDATASOURCE('SQLOLEDB','Data Source=192.168.1.82;User ID=sa;Password=a@1').UCenter.dbo.Site
- --啓用Ad Hoc Distributed Queries
- exec sp_configure 'show advanced options',1
- reconfigure
- exec sp_configure 'Ad Hoc Distributed Queries',1
- reconfigure
- --關閉Ad Hoc Distributed Queries
- exec sp_configure 'Ad Hoc Distributed Queries',0
- reconfigure
- exec sp_configure 'show advanced options',0
- reconfigure
exec sp_addlinkedserver 'server_link','','SQLOLEDB','192.168.1.82' --創建服務器
exec sp_addlinkedsrvlogin 'server_link','false',null,'sa','a@1'--設置服務器鏈接
exec sp_serveroption 'server_link','rpc out','true' --這個允許調用鏈接服務器上的存儲過程
go
exec sp_helpserver--查詢服務器
exec sp_dropserver 'server_link','droplogins'--刪除服務器
select * from server_link.UCenter.dbo.Site
select * from server_link.UCenter.dbo.Member
--臨時創建跨服務器
select * from OPENDATASOURCE('SQLOLEDB','Data Source=192.168.1.82;User ID=sa;Password=a@1').UCenter.dbo.Site
--啓用Ad Hoc Distributed Queries
exec sp_configure 'show advanced options',1
reconfigure
exec sp_configure 'Ad Hoc Distributed Queries',1
reconfigure
--關閉Ad Hoc Distributed Queries
exec sp_configure 'Ad Hoc Distributed Queries',0
reconfigure
exec sp_configure 'show advanced options',0
reconfigure
我們需要在存儲過程中跨庫操作另一個存儲過程
這裏開始事務使用:begin distributed transaction
- use NorthWind --遠程數據庫
- go
- alter procedure pro_pro1
- @Name varchar(16),
- @ReturnState int output
- as
- begin transaction test1
- insert into dbo.Categories(CategoryName)values(@Name)
- if(@@ERROR <> 0)
- begin
- print @@IDENTITY
- set @ReturnState = @@IDENTITY
- rollback transaction test1
- end
- else
- begin
- set @ReturnState = 0
- commit transaction test1
- end
- go
- --在本地創建
- --創建遠程鏈接服務
- exec sp_addlinkedserver 'srv_lnk','','SQLOLEDB','WIN-QL1C52TNRPO\SQLSERVER_2008'
- exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'sa','817708'
- exec sp_serveroption 'srv_lnk','rpc out','true' --這個允許調用鏈接服務器上的存儲過程
- go
- EXEC master.dbo.sp_serveroption @server=N'LnkDW', @optname=N'rpc', @optvalue=N'true'
- GO
- EXEC master.dbo.sp_serveroption @server=N'LnkDW', @optname=N'rpc out', @optvalue=N'true'
- GO
- use HR_DB --本地數據庫
- go
- alter procedure pro_pro2
- @Name varchar(15),
- @u_name varchar(60),
- @result int output,
- @ReturnState int output
- as
- --對於遠程事務 on全部回滾 off回滾錯誤語句
- set xact_abort on
- --開啓遠程事務
- begin distributed transaction test2
- insert into dbo.bonus(major_kind_name) values(@u_name)
- if(@@ERROR <> 0)
- begin
- set @ReturnState = 1
- rollback transaction test2
- end
- else
- begin
- set @ReturnState = 0
- --跨庫執行存儲過程
- exec srv_lnk.NorthWind.dbo.pro_pro1 @Name,@result
- commit transaction test2
- end
- go
- exec srv_lnk.HR_DB.dbo.pro_pro2 '','','',''
- --刪除鏈接
- exec sp_dropserver 'srv_lnk','droplogins'
- go
- declare @result int , @ReturnState int
- exec pro_pro2 'fffffffffffffff','ffffffffffffffff',@result,@ReturnState
use NorthWind --遠程數據庫
go
alter procedure pro_pro1
@Name varchar(16),
@ReturnState int output
as
begin transaction test1
insert into dbo.Categories(CategoryName)values(@Name)
if(@@ERROR <> 0)
begin
print @@IDENTITY
set @ReturnState = @@IDENTITY
rollback transaction test1
end
else
begin
set @ReturnState = 0
commit transaction test1
end
go
--在本地創建
--創建遠程鏈接服務
exec sp_addlinkedserver 'srv_lnk','','SQLOLEDB','WIN-QL1C52TNRPO\SQLSERVER_2008'
exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'sa','817708'
exec sp_serveroption 'srv_lnk','rpc out','true' --這個允許調用鏈接服務器上的存儲過程
go
EXEC master.dbo.sp_serveroption @server=N'LnkDW', @optname=N'rpc', @optvalue=N'true'
GO
EXEC master.dbo.sp_serveroption @server=N'LnkDW', @optname=N'rpc out', @optvalue=N'true'
GO
use HR_DB --本地數據庫
go
alter procedure pro_pro2
@Name varchar(15),
@u_name varchar(60),
@result int output,
@ReturnState int output
as
--對於遠程事務 on全部回滾 off回滾錯誤語句
set xact_abort on
--開啓遠程事務
begin distributed transaction test2
insert into dbo.bonus(major_kind_name) values(@u_name)
if(@@ERROR <> 0)
begin
set @ReturnState = 1
rollback transaction test2
end
else
begin
set @ReturnState = 0
--跨庫執行存儲過程
exec srv_lnk.NorthWind.dbo.pro_pro1 @Name,@result
commit transaction test2
end
go
exec srv_lnk.HR_DB.dbo.pro_pro2 '','','',''
--刪除鏈接
exec sp_dropserver 'srv_lnk','droplogins'
go
declare @result int , @ReturnState int
exec pro_pro2 'fffffffffffffff','ffffffffffffffff',@result,@ReturnState
執行如果都成功的話 則會提交,如果其中有一個執行失敗的話,執行結果會顯示影響數,但數據庫並沒有此數據。