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


    执行如果都成功的话 则会提交,如果其中有一个执行失败的话,执行结果会显示影响数,但数据库并没有此数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值