zoukankan      html  css  js  c++  java
  • SQLSERVER分布式事务使用实例

    实例一

    尊重原著作:本文参考自http://www.jb51.net/article/43540.htm

    --BEGIN DISTRIBUTED TRANSACTION [transactionname]
    --标志一个由分布式事务处理协调器MSDTC管理的TSQL分布式事务开始
    --SERVER A服务器为主控服务器。当连接发出后续COMMIT TRANSACTION或
    --ROLLBACK TRANSACTION语句时,主控服务器请求MSDTC在所涉及的服务器间管理
    --分布式事务的完成 

    --SQLSERVER使用链接服务器或者远程服务器作为分布式事务处理的平台,提供
    --远程存储过程调用和分布式查询


    --当使用分布式事务进行一个远程存储过程调用和一个分布式查询时,在SERVER A
    --上发出BEGIN DISTRIBUTED TRANSACTION ,该连接调用SERVER B上的存储过程
    --和SERVER C上的另一个存储过程,并且SERVER C上的存储过程对SERVER D执行一个
    --分布式查询,则四个SQLSERVER服务器进入分布式事务中,SERVER A是该事务的创建者
    --和控制服务器

    --创建分布式事务,在本地和远程数据库同时删除一条记录,其中,远程SQLSERVER
    --的实例名称为RemoteServer。本地和远程数据库同时提交或同时回滚该事务。
    --注意,执行分布式查询或调用存储过程时,使用4部分名称限定规则

    --前提:本机的MSDTC和远程机器的MSDTC服务要打开
    --本机和远程机器能互相ping通
    --数据库端口能互相telnet通
    --创建一个链接服务器到远程机器ITSV

    if exists(select * from sys.servers where name='DBSeverMSSQL2008')
      EXEC sp_dropserver  'DBSeverMSSQL2008', 'droplogins'
    EXEC sp_addserver  'DBSeverMSSQL2008'
    EXEC sp_addlinkedsrvlogin  'DBSeverMSSQL2008', 'false',null, 'sa', '123321'
    EXEC sp_serveroption 'DBSeverMSSQL2008', 'data access', 'on'  --未将服务器 'DBSeverMSSQL2008' 配置为用于 DATA ACCESS。添加此句。

    SET xact_abort on --对于大多数 OLE DB 提供程序(包括 SQL Server),必须将隐式或显示事务中的数据修改语句中的 XACT_ABORT 设置为 ON。唯一不需要该选项的情况是在提供程序支持嵌套事务时。


    USE [SVTCCData]
    GO
    SELECT * FROM [VJ17A69HHC4ZMASMSSQLSERVER1].[SVTCCData].[dbo].[2014TestRemote] WHERE [Name]='lt3'
    SELECT * FROM [DBSeverMSSQL2008].[SCJZData].[dbo].[2014TestRemote] WHERE [Name]='lt3' 

    USE [SVTCCData]
    GO
    BEGIN DISTRIBUTED TRANSACTION
    --从本地数据库删除一条记录
    DELETE FROM [VJ17A69HHC4ZMASMSSQLSERVER1].[SVTCCData].[DBO].[2014TestRemote]
    WHERE [Name]='lt3'

    --从远程数据库中删除一条记录
    DELETE FROM [DBSeverMSSQL2008].[SCJZData].[dbo].[2014TestRemote]
    WHERE [Name]='lt3'

    COMMIT TRAN
    GO


    --个人尝试了下是由于在双向的sql server访问中采用了链式方式访问(LinkedServer方式),
    --遇到这种情况只需要将原来访问对方数据库的语句:
    --select  *  from  linkedServerA.dbo.table1
    --修改为:
    --select  *  from  dbo.table1即可。

    实例二

    /*
     主控机:Win XP,SQL Server 2008 R2
     资源机:Win Server 2008 R2,SQL Server 2008 R2
     表结构:无Identity列
     调用方式:SQL语句
     测试回滚:测试
    */


    If Exists(select * from sys.servers where name='ITSV')
      EXEC sp_dropserver  'ITSV', 'droplogins' 
    EXEC sp_addlinkedserver  'ITSV', '', 'SQLOLEDB', 'DBSeverMSSQL2008'
    EXEC sp_addlinkedsrvlogin  'ITSV', 'false',null, 'sa', '123321'
    SET xact_abort on

    BEGIN DISTRIBUTED TRANSACTION

      Insert Into [2014TestRemote](ID,name,phone)Values(101,'101','101')

      Delete ITSV.SCJZData.dbo.[2014TestRemote]

      Insert Into ITSV.SCJZData.dbo.[2014TestRemote]
        Select * From [2014TestRemote]

      Update ITSV.SCJZData.dbo.[2014TestRemote] Set ID='Test2'

    COMMIT TRAN
    GO

    EXEC sp_dropserver  'ITSV', 'droplogins'

  • 相关阅读:
    Python (time、datetime、random、os、sys、shutil)模块的使用
    ELK6+filebeat、kafka、zookeeper搭建文档
    JDBC-用Java语句操作数据库
    数据库对象
    sql之子查询
    函数之sql语句
    sql之select语句
    oracle 数据库
    网络编程
    多线程——多线程的运行轨迹,线程的生命周期,线程的常用方法,线程的安全问题,死锁,线程间的通信
  • 原文地址:https://www.cnblogs.com/hlxt548826/p/3945058.html
Copyright © 2011-2022 走看看