調用MSDTC控制分散式Transaction

原创 2006年06月06日 10:46:00

MSDN上多方查找資料,找到了調用MSDTC處理Transaction的函數,經過測試后整理如下:

unit DTCTransaction;

 

interface

uses

  SysUtils,OleDB,COmObj,DCConst,Windows;

const

  CLSID_MSDASQL  :TGUID='{C8B522CB-5CF3-11CE-ADE5-00AA0044773D}'; //oledb for ODBC

  CLSID_SQLOLEDB :TGUID='{0C7FF16C-38E3-11D0-97AB-00C04FC2AD98}'; //oledb for sql server

 

  function  DTCTransactionStart:ITransaction;

  procedure DTCTransactionCommit(ATransaction:ITransaction);

  procedure DTCTransactionRollback(ATransaction:ITransaction);

 

implementation

 

  function DtcGetTransactionManager(

    hostName:PChar;

    tmName:PChar;

    iid:Pointer;//pointer of TGUID;

    dwReserved1:DWord;

    wReserved2:Word;

    pvReserved:Pointer;

    out txnDispenser:ITransactionDispenser):HResult;cdecl;external 'xolehlp.dll';

 

function DTCTransactionStart:ITransaction;

var

  ID:ITransactionDispenser;

begin

  Result:=nil;

  OLECheck(DtcGetTransactionManager(

    nil,

    nil,

    @IID_ITransactionDispenser,

    0,0,

    nil,

    ID));

 

  OLECheck(ID.BeginTransaction(nil,

    TransactionISOLATIONLEVEL,

    ISOFLAG_RETAIN_DONTCARE,nil,Result));

end;

 

procedure DTCTransactionCommit(ATransaction:ITransaction);

begin

  OLECheck(ATransaction.Commit(false,0,0));

end;

 

procedure DTCTransactionRollback(ATransaction:ITransaction);

var

  B:BOID;

begin

  OLECheck(ATransaction.Abort(@B,false,false));

end;

 

end.

ADO加入分散式Transaction的方法:

unit ADOTransaction;

 

interface

uses

  ADODB,ADOInt,OLEDB,ComObj,DCConst;

 

  procedure JoinSessionIntoTransaction(AConnectionArray:array of TADOConnection;

            ATransaction:ITransaction);

  procedure UnJoinSession(AConnectionArray:array of TADOConnection);

 

implementation

 

procedure JoinSessionIntoTransaction(AConnectionArray:array of TADOConnection;

  ATransaction:ITransaction);

var

  ICC:ADOConnectionConstruction;

  ISP:IInterface;

  ITJ:ITransactionJoin;

  i:integer;

begin

  for i:=Low(AConnectionArray) to High(AConnectionArray) do

  begin

    if not AConnectionArray[i].Connected then AConnectionArray[i].Open;

    OLECheck(AConnectionArray[i].ConnectionObject.QueryInterface(

      IID_ADOConnectionConstruction,ICC));

    ISP:=ICC.Get_Session;

    OLECheck(ISP.QueryInterface(IID_ITransactionJoin,ITJ));

    OLECheck(ITJ.JoinTransaction(ATransaction,TransactionISOLATIONLEVEL,0,nil));

  end;

end;

 

procedure UnJoinSession(AConnectionArray:array of TADOConnection);

var

  ICC:ADOConnectionConstruction;

  ISP:IInterface;

  ITJ:ITransactionJoin;

  i:integer;

begin

  for i:=Low(AConnectionArray) to High(AConnectionArray) do

  begin

    if AConnectionArray[i].Connected then

    begin

      OLECheck(AConnectionArray[i].ConnectionObject.QueryInterface(

        IID_ADOConnectionConstruction,ICC));

      ISP:=ICC.Get_Session;

      OLECheck(ISP.QueryInterface(IID_ITransactionJoin,ITJ));

      OLECheck(ITJ.JoinTransaction(nil,0,0,nil));

    end;

  end;

end;

 

end.

分散式控制系统的组态

  • 2015年04月21日 08:54
  • 2.22MB
  • 下载

同构分散式数据库数据汇总(集成)

如题,项目需要从下属分支机构汇总其录入的数据到总部,进行数据的分析统计展示。 各处数据库结构相同。项目开发基于DotNet,使用Microsoft SQL Server 2005。 最初,考虑的方...

ISP分散式架構整合

  • 2013年04月01日 15:25
  • 79KB
  • 下载

【英语文章-阅读分享-201406[01]】Google发现:使用集中式和分布式数据架构比完全的分散式架构工作得更好

Google Finds: Centralized Control, Distributed Data Architectures Work Better Than Fully Decentral...

VB.NET的分散式设计

新一代的软件程序通常包含了多个逻辑层的组合(例如三层),并且在不同实体主机上执行,换句话说就是分散式应用程序。 g.163.com/prevPhDownload.do?host=xujiaolf&a...

建构分散式系统 .NET Remoting篇

  • 2007年08月15日 11:25
  • 1.03MB
  • 下载

mysql之commit,transaction事物控制

简单来说,transaction就是用来恢复为以前的数据。 举个例子,我想把今天输入到数据库里的数据在晚上的时候全部删除,那么我们就可以在今天早上的时候开始transaction事物,令autoco...

分散控制系统综合测试探讨

  • 2010年10月25日 19:30
  • 77KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:調用MSDTC控制分散式Transaction
举报原因:
原因补充:

(最多只允许输入30个字)