实战COM(08)----COM+的特性之事务、及时激活

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

 

本文欢迎转载,唯请注明出处及作者 blackcolor@263.net
---------------------------------------------------

                   实战COM(08)----COM+的特性之事务、及时激活

一、创建组件
1)创建一个进程内组件Step05,加入一个“Simple Object”,命名为“Simple05”,修改
  “Threading Model”属性为“Both”, “Interface”属性为“custom”。
2)给接口ISimple05增加一个方法HRESULT ModifyData()
3)修改文件Simple05.cpp

// Simple05.cpp : Implementation of CSimple05
#include "stdafx.h"
#include "Step05.h"
#include "Simple05.h"

#include <mtx.h> // 事务支持
#include <atldbcli.h> // 数据库操作

// 加入comutil支持
#include <comutil.h>
#pragma comment( lib, "comsupp.lib" )

/////////////////////////////////////////////////////////////////////////////
// CSimple05

// 定义一个新类
class CAuthors
{
public:
 // 数据--宽度来源于表Authors
 char m_szAu_Id[12];  
 char m_szAu_lName[41];
 
 // 参数绑定
 BEGIN_PARAM_MAP(CAuthors)
  COLUMN_ENTRY(1, m_szAu_lName)
  COLUMN_ENTRY(2, m_szAu_Id)
 END_PARAM_MAP()
};


STDMETHODIMP CSimple05::ModifyData()
{
 CDataSource Connection;
 CSession Session;
 CCommand<CAccessor<CAuthors> > Authors;
 HRESULT  hr;

 // 取事务环境接口
 IObjectContext* pObjectContext = NULL;
 hr = GetObjectContext(&pObjectContext);
 if(FAILED(hr) || ! pObjectContext) return hr;

 // 检查是否存在事务环境
 if(! pObjectContext->IsInTransaction()) return E_FAIL;

 // 打开数据库
 CDBPropSet dbinit(DBPROPSET_DBINIT);
 dbinit.AddProperty(DBPROP_INIT_DATASOURCE, OLESTR("GP2000"));   // 服务器名
 dbinit.AddProperty(DBPROP_AUTH_USERID, OLESTR("sa"));    // 用户名
 dbinit.AddProperty(DBPROP_AUTH_PASSWORD, OLESTR("123"));   // 密码
 dbinit.AddProperty(DBPROP_AUTH_PERSIST_SENSITIVE_AUTHINFO, false);
 dbinit.AddProperty(DBPROP_INIT_CATALOG, OLESTR("pubs"));   // 数据库名
 dbinit.AddProperty(DBPROP_INIT_LCID, (long)2052);
 dbinit.AddProperty(DBPROP_INIT_PROMPT, (short)4);
 hr = Connection.Open(_T("SQLOLEDB.1"), &dbinit);
 if (FAILED(hr)) return hr;
 
 hr = Session.Open(Connection);
 if (FAILED(hr)) 
 {
  Connection.Close();
  return hr;
 }
 // 设置更新条件  
 strcpy(Authors.m_szAu_Id,    "172-32-1176"); // 172-32-1176
 strcpy(Authors.m_szAu_lName, "MY name"); // White
 hr = Authors.Open(Session, "Update Authors Set Au_lName = ? Where Au_Id = ?");
 
 if(pObjectContext)
 {
  if(SUCCEEDED(hr))
  {
   pObjectContext->SetComplete(); // 提交事务
  }
  else
  {
   pObjectContext->SetAbort();
  }
 }

 Session.Close();
 Connection.Close();

 return hr;
}

二、创建客户端
1)客户端文件如下:
// Client.cpp 文件 -- COM+的事务特性

#include <windows.h>
#include <stdio.h>
//#include <winerror.h>
// 加入comutil支持
#include <comutil.h>
#pragma comment( lib, "comsupp.lib" )

// 包含com的定义文件,以下两个文件从step05中拷贝出来
#include "../step05/step05.h"
#include "../step05/step05_i.c"

void main()
{
 ISimple05 * pISimple05=NULL;  // 我们定义的接口

 // 初始化
 HRESULT hr = CoInitialize(NULL);
 if(FAILED(hr))
 {
  printf("Coinitialize failed! hr=0x%x", hr);
  return ;
 }

 // 创建COM对象
 hr = CoCreateInstance(CLSID_Simple05, NULL, CLSCTX_ALL,
                    IID_ISimple05, (void **)&pISimple05);
 if(FAILED(hr))
 {
  printf("create com failed! hr=0x%x", hr);
  CoUninitialize();
  return ;
 }
 // 修改数据
 hr=pISimple05->ModifyData();
 if(SUCCEEDED(hr)) printf("Modify Ok!");
 else printf("Modify failed hr=0x%x/n");

 pISimple05->Release();
 CoUninitialize();

 return ;
}

三、配置COM+组件
1)从管理工具打开“组件服务”,创建一个COM+组件STEP05,加入动态连接库step05.dll,操作同前面几节一样
2)设置“Step05.Simple05.1”属性,如下图,将事务支持设置成“需要”

3)导出并配置com+的客户端,运行客户软件client.exe

四、说明
1)本节简单介绍了COM+事务的使用,你可以发现在COM+中使用事务还是比较简单的,但是,如果事务本身比较复杂
  会给程序的编写带来很多困难,例如,如果一个事务需要一个较长的时间来完成,它将长时间锁住系统的资源,
  而阻止了其他并发用户访问此资源。如何解决资源的共享与死锁始终是网络软件设计一大难题。
2)本节没有提到“及时激活”的特性,其实当我们将该组件的事务设置成“需要”时,它就自动支持了“及时激活”
  的特性,如下图:


SAP GUI Scripting失效了?别慌,手把手教你配置SAP Scripting Tracker替代方案(Win10/Win11适用) 本文详细介绍了SAP GUI Scripting失效后的高效替代方案——SAP Scripting Tracker,适用于Win10/Win11系统。通过技术背景分析、环境配置指南和实战案例,帮助IT团队快速掌握现代化自动化解决方案,提升企业级自动化流程的效率和兼容性。 阅读详情

相关推荐

SAP Gateway CSRF防护:从原理到配置与排障的完整指南

跨站请求伪造(CSRF)是一种常见的Web安全漏洞,攻击者利用用户已登录的会话状态,诱导浏览器向目标服务器发送恶意请求。其核心原理在于浏览器会自动携带会话Cookie,使得服务器误认为是用户的合法操作。为防御此类攻击,现代Web应用普遍采用CSRF令牌(Token)验证机制,该技术通过在服务器生成并与客户端同步一个不可预测的令牌,确保非安全请求的合法性。这一机制对于保护关键业务操作、防止数据篡改具有重要价值,尤其在企业级应用和API服务中至关重要。在SAP生态中,SAP Gateway作为核心的OData服

weixin_33946020的博客 466

由于激活没有指定时间完成COM+ 激活没有成功的解决方案!

系统是这样的:C#2005+oracle+Remoting+Com+一个分布式应用,中间层使用Remoting的架构,且该远程对象基于com+完成事务控制。这些代码如果需要给我留言!!这两天被一个问题拦住了,恨不能自杀,求了很多人没有结果。最后居然被自己搞定了!! 而且是在一个english论坛上搞定的, 现公布如下: (原文) Please   see   if   setting  

PMP-DoNET 2650

C++实现USB HID双向通信:从协议解析到STM32与PC端实战

USB HID协议作为人机接口设备的核心标准,通过定义一套通用的报告描述符机制,实现了设备与主机间免驱、即插即用的数据交换能力。其原理基于中断传输模式,通过预定义的报告格式在设备端与主机端进行双向通信,在嵌入式开发与系统级软件集成中具有重要技术价值。该技术广泛应用于自定义输入设备、数据采集器、工业控制面板等场景,尤其适合需要高实时性与低延迟的交互应用。本文聚焦于STM32微控制器与C++主机程序的开发实践,深入解析HID报告描述符的编写与hidapi库的应用,为构建稳定高效的USB通信系统提供完整解决方案。

weixin_33801856的博客 1236

运行MapXtreme的Web应用程序报错; COM+ 激活方法!

由于初始化函数失败,COM+ 激活失败。有关更多信息,请查看事件日志。 说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.Runtime.InteropServices.COMException: 由于初始化函数失败,COM+ 激活失败。有关更多信息,请查看事件日志。 源错误: 执行...

weixin_33871366的博客 226

Java全栈工程师面试深度解析与实战指南

Java全栈开发作为当前企业级应用开发的核心方向,要求开发者具备从基础到架构的多维度技术能力。理解JVM内存模型、并发编程原理等底层机制是解决生产环境OOM、高并发问题的关键。Spring Boot通过自动配置和条件装配等机制大幅提升开发效率,其启动优化、性能调优等实战经验对工程实践至关重要。在微服务架构下,分布式事务方案选型与服务网格集成成为新的技术挑战。全栈工程师需要掌握前后端协作规范,实现从用户界面到数据存储的全链路性能优化。面试中HashMap树化改造、Feign拦截器实现等真题,反映了企业对技术深

weixin_34413802的博客 338

《.NET分布式应用程序开》读书笔记 第一章:理解分布式架构

《.NET分布式应用程序开》读书笔记 第一章:理解分布式架构 一:何谓分布式? 首先,分布式应用的执行通常将会在几个计算机上完成。这是它和“单机版”应用程序的主要区别。总结的来说,分布式应用的主要目标就是为了提高系经的整体性能和可伸缩性。它可以避免当Client...

alieen_941124的博客 165

Spring Boot数据库配置全解析:从基础到高可用实战

数据库连接是Java后端应用与数据层交互的核心通道,其配置的合理性直接影响系统的性能与稳定性。在Spring Boot框架中,通过application.yml文件进行数据源配置是标准实践,这涉及到JDBC驱动选择、连接字符串参数优化以及连接池的精细调优。理解连接池的工作原理,如HikariCP的连接管理机制,对于实现高性能的数据访问至关重要。合理的配置能有效避免连接泄露、资源耗尽等问题,其技术价值在于保障应用在高并发场景下的响应能力与可用性。在实际应用场景中,无论是应对多环境部署、实现多数据源隔离,还是针

weixin_33924312的博客 432

WebSocketFrameEncoder&WebSocketFrameDecoder源码浅析

HTTP已经诞生了数十年,具有广泛的应用,各种优化专门的优化机制也已经被浏览器及服务器等设备实施,XHR 请求自然而然就继承了所有这些功能。然而,对于只使用HTTP协议完成升级协商的WebSocket来说,流式数据处理可以让我们在客户端和服务器间自定义协议,但也会错过浏览器提供的很多服务,应用可能必须实现自已的逻辑来填充某些功能空白,比如缓存、状态管理、元数据交付等等。

pscool的博客 307

Linux服务器时间不准?三层模型诊断与NTP同步实战指南

在计算机系统中,时间同步是确保分布式系统、数据库和日志记录等关键功能正常运行的基础。其核心原理是通过网络时间协议(NTP)来校准因硬件晶振误差导致的系统时钟漂移(Clock Drift),从而维持全局时间的一致性。这项技术的价值在于,它能避免因时间偏差引发的数据不一致、SSL证书验证失败和监控告警失灵等一系列严重故障。在实际应用场景中,无论是单机服务器还是大规模集群,都需要通过配置可靠的NTP时间源来构建稳定的时间体系。本文聚焦于Linux环境下的时间管理,深入解析时区、系统时钟与NTP同步这三个核心概念,

weixin_30555515的博客 304

Java8+ActFramework双库官网架构实战指南

企业级Web应用架构需兼顾稳定性、可维护性与落地效率。Java8作为长期支持版本,在政企环境中具备最佳JVM兼容性与运行时稳定性;ActFramework以零XML配置、热加载快、启动迅速等特性,为中小团队提供比Spring Boot更轻量可控的开发体验。结合MySQL保障强一致性事务,MongoDB处理高并发非结构化日志,形成科学的数据分层范式。bootstrap与AngularJS组合则显著降低前后端协作门槛,让后端工程师也能高效维护响应式页面。本文详解该技术栈在真实官网项目中的选型依据、模块协同、部署

weixin_29913663的博客 276

BigQuery实战指南:从零搭建生产级云数据仓库

云数据仓库是现代数据分析基础设施的核心组件,其本质是将计算与存储解耦,以支持海量数据的高效OLAP查询。基于Dremel与Colossus等底层技术,BigQuery实现了serverless架构、自动扩缩容和按量计费等关键能力,显著降低运维复杂度与使用门槛。相比传统MPP数仓需手动调优分布键与排序键,BigQuery通过列式存储、智能分区与聚簇等原生优化,让标准SQL即可获得亚秒级响应。它特别适用于中小团队快速构建实时分析能力、落地数据驱动决策,并天然支撑BigQuery ML等AI融合场景。本文聚焦真实

culi3182的博客 396

Rolldown 插件 API 完全指南:编写与 Rollup 兼容的高性能打包插件

Rolldown 是一个使用 Rust 编写的 JavaScript/TypeScript 打包器,其插件接口与 Rollup 几乎完全兼容(兼容性逐项追踪见 [docs/apis/plugin-api.md](https://link.gitcode.com/i/f49a47064da43e4eb75892e50fd15970) 中引用的 issue #819)。本篇指南以官方 [Plugin

gitblog_00266的博客 868

MongoDB Schema Validation 实战指南:用 JSON Schema 保障数据质量

MongoDB 的 Schema Validation 是文档数据库中保障数据一致性的核心机制,其本质是基于 JSON Schema 标准对写入文档执行声明式校验。它通过 bsonType 类型约束、required 必填字段、pattern 正则匹配、enum 枚举控制等原理,在内核层实现原子性验证,避免应用层校验导致的一致性断裂与绕过风险。该技术显著提升数据契约的可维护性与跨系统复用能力,广泛应用于用户注册、订单管理、权限控制等强数据规范场景。本文聚焦真实生产环境中的配置方法、性能陷阱(如 ReDoS)

weixin_30632089的博客 320

MuleSoft+LangChain双引擎AI编排架构实战

AI编排(AI Orchestration)是企业实现大模型落地的核心能力,本质是将自然语言指令转化为可执行、可审计、可合规的多系统协同工作流。其技术原理在于解耦数据集成与AI推理:前者依赖企业级连接器、细粒度权限控制与高可靠数据管道,后者依托动态提示工程、工具调用链与状态化推理。该架构显著提升AI生成结果的事实准确性与业务适配性,广泛应用于销售智能助手、合规审计报告、客户流失预警等场景。本文聚焦MuleSoft与LangChain混合架构,详解如何通过数据流、控制流与安全流三重分离,构建稳定、灵活、可过审

ckkay800264的博客 355

USB-HID学习笔记

USB协议详解:传输机制与设备管理 摘要:USB采用主从架构,支持多种传输速度(低速1.5Mbps/全速12Mbps/高速480Mbps)。系统通过分层集线器最多可连接127个设备,采用4线电缆传输(电源/差分数据/地线)。协议定义了4种传输类型:控制传输(设备枚举)、批量传输(大容量数据)、中断传输(实时交互)和等时传输(音视频流)。设备通过描述符体系(设备/配置/接口/端点)向主机报告能力,其中端点0为强制控制端点。USB2.0新增PING机制优化批量传输效率,OTG规范通过ID线实现主从角色切换。数据

2401_88141322的博客 471

构建可进化的营销智能体:LangMem+LangGraph实战

营销智能体是面向增长目标的AI决策系统,其核心在于将用户行为、业务结果与策略反馈构建成可追溯、可归因、可迭代的因果链路。不同于传统RAG式问答或模板化内容生成,它依托记忆增强(如LangMem)实现事件-洞察-策略的分层知识管理,并通过图状态机(如LangGraph)编排条件驱动的闭环决策流。这种架构天然适配AB测试归因、实时策略调优、跨渠道用户旅程建模等高阶场景,显著缩短‘发现问题→验证假设→部署优化’的运营周期。本文聚焦Self-Learning能力在真实营销系统中的工程落地,详解如何用LangMem构

weixin_30832405的博客 620

GPT-5、Claude 4.1与Grok 4编程实战能力对比分析

编程AI不是通用智能体,而是面向软件工程全链路的专用协作者。其核心价值体现在代码生成的上下文锚定精度、Bug诊断的环境感知深度、以及重构过程中的规范适配能力。GPT-5擅长多栈协同与快速原型,Claude 4.1强于类型安全与工程规范,Grok 4则在Kubernetes、Shell、系统级调试等基础设施场景具备显著优势。三者差异本质是训练数据分布、推理机制与领域对齐策略的不同——前者偏重开发者意图理解,后者深耕生产环境直觉。真实开发中,决定效能的并非单点性能,而是AI与团队技术栈、CI/CD流程及SRE能

weixin_30536513的博客 392
上一篇: 实战COM(07)----COM+的特性之建立者字符串
下一篇: 实战COM(09)----COM+的特性之对象池
blackcolor
博客等级 码龄26年 1粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值