SQL Server 分佈式存儲過程事務

首先先要對SQL Server dtc 配置

 

打開“控制面板―管理工具―組件服務”(或者運行“Dcomcnfg.exe”) 打開“組件服務―計算機” 在“我的電腦”上點擊右鍵,點擊“屬性” 在MSDTC選項卡中,點擊“安全配置”按鈕。

 

操作如下:

 

 

SET XACT_ABORT ON 的設置

當爲ON時,如果你存儲中的某個地方出了問題,整個事務中的語句都會回滾爲OFF時,只回滾錯誤的地方

 

跨庫操作:

  1. exec sp_addlinkedserver 'server_link','','SQLOLEDB','192.168.1.82' --創建服務器   
  2. exec sp_addlinkedsrvlogin 'server_link','false',null,'sa','a@1'--設置服務器鏈接   
  3. exec sp_serveroption 'server_link','rpc out','true' --這個允許調用鏈接服務器上的存儲過程   
  4. go  
  5. exec sp_helpserver--查詢服務器   
  6. exec sp_dropserver 'server_link','droplogins'--刪除服務器   
  7.   
  8. select * from server_link.UCenter.dbo.Site  
  9. select * from server_link.UCenter.dbo.Member  
  10.   
  11. --臨時創建跨服務器   
  12. select * from OPENDATASOURCE('SQLOLEDB','Data Source=192.168.1.82;User ID=sa;Password=a@1').UCenter.dbo.Site  
  13.   
  14. --啓用Ad Hoc Distributed Queries   
  15. exec sp_configure 'show advanced options',1    
  16. reconfigure    
  17. exec sp_configure 'Ad Hoc Distributed Queries',1    
  18. reconfigure   
  19.   
  20. --關閉Ad Hoc Distributed Queries   
  21. exec sp_configure 'Ad Hoc Distributed Queries',0    
  22. reconfigure    
  23. exec sp_configure 'show advanced options',0    
  24. 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

  1. use NorthWind --遠程數據庫   
  2. go  
  3.   
  4. alter procedure pro_pro1  
  5.     @Name varchar(16),  
  6.     @ReturnState int output  
  7. as  
  8.     begin transaction test1  
  9.     insert into dbo.Categories(CategoryName)values(@Name)  
  10.     if(@@ERROR <> 0)  
  11.         begin  
  12.             print @@IDENTITY  
  13.             set @ReturnState = @@IDENTITY  
  14.             rollback transaction test1  
  15.         end  
  16.     else  
  17.         begin  
  18.             set @ReturnState = 0  
  19.             commit transaction test1  
  20.         end  
  21. go  
  22.   
  23. --在本地創建   
  24. --創建遠程鏈接服務   
  25. exec sp_addlinkedserver 'srv_lnk','','SQLOLEDB','WIN-QL1C52TNRPO\SQLSERVER_2008'   
  26. exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'sa','817708'   
  27. exec sp_serveroption 'srv_lnk','rpc out','true' --這個允許調用鏈接服務器上的存儲過程   
  28. go   
  29.   
  30. EXEC master.dbo.sp_serveroption @server=N'LnkDW', @optname=N'rpc', @optvalue=N'true'  
  31. GO  
  32. EXEC master.dbo.sp_serveroption @server=N'LnkDW', @optname=N'rpc out', @optvalue=N'true'  
  33. GO  
  34.   
  35. use HR_DB --本地數據庫   
  36. go  
  37.   
  38. alter procedure pro_pro2  
  39.     @Name varchar(15),  
  40.     @u_name varchar(60),  
  41.     @result int output,  
  42.     @ReturnState int output  
  43. as  
  44.     --對於遠程事務 on全部回滾 off回滾錯誤語句   
  45.     set xact_abort on  
  46.     --開啓遠程事務   
  47.     begin distributed transaction test2  
  48.     insert into dbo.bonus(major_kind_name) values(@u_name)  
  49.     if(@@ERROR <> 0)  
  50.         begin  
  51.             set @ReturnState = 1  
  52.             rollback transaction test2  
  53.         end  
  54.     else  
  55.         begin  
  56.             set @ReturnState = 0  
  57.             --跨庫執行存儲過程   
  58.             exec srv_lnk.NorthWind.dbo.pro_pro1 @Name,@result  
  59.             commit transaction test2  
  60.         end  
  61. go  
  62.   
  63.   
  64. exec srv_lnk.HR_DB.dbo.pro_pro2 '','','',''  
  65.   
  66. --刪除鏈接   
  67. exec sp_dropserver 'srv_lnk','droplogins'   
  68. go  
  69.   
  70. declare @result int , @ReturnState int  
  71. 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


執行如果都成功的話 則會提交,如果其中有一個執行失敗的話,執行結果會顯示影響數,但數據庫並沒有此數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章