.Net SAP 事务从客户端重新启动

问题描述 投票:0回答:3

我正在使用 .Net NCo 3.0 库,我尝试了 tRFC 的一个示例,其中我看到交易 ID 已创建并与 RFC 函数关联,然后被调用,成功交易后,交易 ID 被删除,这里我们维护每个tRFC操作的事务详细信息在数据库中,所以,在这种情况下,如果事务失败,我们可以从数据库中获取ID,然后重试,我想知道重试机制的代码实现,有可能SAP服务器宕机了,那么何时以及如何重启并确保发起的事务只执行一次,不丢失数据,不重复。

TidStore tidStore = new TidStore("clientTidStore", false);

 static RfcTransaction CreateTransaction(TidStore tidStore, out string data)
        {
            RfcTransaction trans = new RfcTransaction(); // This creates a fresh TID.;
            Console.Write("Please enter some input data: ");
            data = Console.ReadLine();

            FileStream dataFile = new FileStream(trans.Tid.TID, FileMode.Create, FileAccess.ReadWrite);
            byte[] utf8Data = Encoding.UTF8.GetBytes(data);
            dataFile.Write(utf8Data, 0, utf8Data.Length);
            dataFile.Close();
            tidStore.CreateEntry(trans.Tid.TID);
            return trans;
        }

        private void SubmitTransaction(RfcTransaction trans, TidStore tidStore, String data)
        {
            try
            {
                IRfcTable dataTable = stfc_write_to_tcpic.GetTable("TCPICDAT");
                dataTable.Append();
                dataTable.SetValue(0, data);

                // Insert the function module into the transaction:
                trans.AddFunction(stfc_write_to_tcpic);
                stfc_write_to_tcpic = (IRfcFunction)stfc_write_to_tcpic.Clone();
                dataTable = stfc_write_to_tcpic.GetTable("TCPICDAT");
                dataTable.SetValue(0, data + " -- data of the second function module");
                trans.AddFunction(stfc_write_to_tcpic);
                trans.Commit(_ECCsystem);
                tidStore.SetStatus(trans.Tid.TID, TidStatus.Committed, null);

                File.Delete(trans.Tid.TID);
                _ECCsystem.ConfirmTransactionID(trans.Tid);
                tidStore.DeleteEntry(trans.Tid.TID);
            }
            catch (Exception e)
            {
                tidStore.SetStatus(trans.Tid.TID, TidStatus.RolledBack, e.Message);
            }
        }
    }
}
    
c# .net saprfc sap-dotnet-connector
3个回答
1
投票

关于在外部程序端处理和实现SAP事务处理,SAP NetWeaver RFC SDK 7.50编程指南中有一些一般性的解释,我认为这非常有帮助。 请参见第 4.3、4.4 和 5.5 章。它比SAP .NET Connector 3.0 编程指南中的解释更详细,并且也可以轻松适应 NCo 编程 API。


0
投票

您需要创建自己的函数,并设置一个时间间隔来检查哪些 TID 尚未处理。


0
投票

那么何时以及如何重启并确保发起的事务只执行一次,不丢失数据,不重复。

只需定期重新发送回滚的邮件(例如每小时一次),直到它们以“OK”结束。如果您在第一次调用时使用相同的TID并且在交易成功之前不调用ConfirmTransactionID(),则不存在重复的风险。 (如果之前已成功处理该 TID,SAP 系统将识别该 TID 并忽略该数据。)

© www.soinside.com 2019 - 2024. All rights reserved.