新事务之一: dotNET和COM+中的事务(2)

博客介绍了dotNET和COM+中的事务相关内容,文章发布于2002年4月16日,难度等级为6/9,版本是2.32。

新事务之一: dotNETCOM+中的事务

 


小气的神

2002-4-16

 

Article Type: In-Depth 

难度等级:6/9       

版本:2.32

CLR中和事务相关的属性类

属性类

作用

AutoCompleteAttribute

函数内自动完成声明的事务

ConstructionEnabledAttribute

添加construct 字符串

JustInTimeActivationAttribute

即时激活

ObjectPoolingAttribute

对象池

TransactionAttribute

声明事务

 

CLR中和事务有关的方法和属性

属性和方法

接口和方法

DisableCommit

IObjectControl::DisableCommit

EnableCommit

IObjectControl::EnableCommit

SetAbort

IObjectControl::SetAbort

SetComplete

IObjectControl::SetComplete

IsInTransaction

IObjectContextInfo::IsInTransaction

MyTransactionVote

IContextState::Get/SetMyTransactionVote

DeactivateOnReturn

IContextState::Get/StateDeactivateOnReturn

Transaction

IObjectContextInfo::GetTransaction

TransactionId

IObjectContextInfo::GetTransactionId

ContextId

IObjectContextInfo::GetContextId

 

当然在上面的类中我们也可以不加任何的属性控制,只是简单从ServicedComponent继承一个类,那么当我们用RegsvcsCOM+注册我们的组件成功后,COM+设置中依然有一些默认的值,或是我们使用了属性但没有明确的指明属性的值。这些是由System.EnterpriseServices.RegistrationHelper来完成的,事实上Regsvcs在调用完RegasmTlbexp之后就调用了它完成在COM+ Catalogs的注册。

 

下表是CLR中类编译之后的属性(配置和没有配置)

属性

适用范围

没有配置属性时在COM+中的值

使用属性配置但没有显示指明属性在COM+中的值

ApplicationActivation

Assembly

Library

No default

ApplicationID

Assembly

Generated GUID

No default

ApplicationName

Assembly

Assembly name

No default

AutoComplete

Method

False

True

ConstructionEnabled

Class

False

True

JustInTimeActivation

Class

False

True

MustRunInClientContext

Class

False

True

ObjectPooling

Class

False

True

Synchronization

Class

False

SynchronizationOption.Required

Transaction

Class

False

TransactionOption.Required

TransactionIsolationLevel.Serializable

Timeout = infinite

 

从上面看得出属性编程给我们带来的方便和简捷的感觉,比起以前COM方式下的COM+编程方便了许多,不用太多的引用、不用考虑线程的同步、甚至登记到COM+环境中也相当容易。但只能说,如果以前你在COM下工作得不错,现在你这CLR下也可以工作的很好或更好,COM+以及事务编程模型仍然没有改变,从实际需要和应用中分析和构造出事务模型依然还是每个开发人员主要的任务,不过现在你可以有更多的时间和精力来应对这个问题了。

 

 

Windows XPWindows.NET中的可配置事务隔离层(Configurable Transaction Isolation Level

 

Windows XP Widnows.NETCOM+环境下允许我们指定事务隔离等级.

 

这的确是一个盼望已久的新特性,COM+ 1.0中我们只能使用默认的也是最严格的事务隔离等级:Serializable。在Windows XPWindows.NET中的COM+允许我们指定组件的事务隔离等级,可以由开发人员和实际应用决定使用何种隔离等级。不是所有的RMresource managers)都支持目前的定义的四个隔离等级,可能的一个策略是当RM不支持当前的隔离设置那么使用一个更高的隔离等级,Serializable是最严格的隔离等级,同时也是最普通的一个隔离等级,那么也就是说几乎所有的RM都支持这个隔离等级设置(目前COM+支持的四个隔离等级也是MS SQL Server都支持和实现的也是SQL92定义的四个)。同样也不是所有的开发人员都明白这些选项的作用和含义。下面会给出一些通常的解释和信息以便在未来的开发过程中作出选择。

 

多个用户对数据库操作就可能产生数据不一致的情况了,隔离等级就是说事务可以接受不一致数据的程度,是一个事务与其他事务隔离的程度。较低的隔离级别可以增加并发,但代价是降低数据的正确性。相反,较高的隔离级别可以确保数据的正确性,但可能对并发产生负面影响。我们在COM+中要求的隔离级别确定了RM使用锁的行为。不同的隔离等级可能会带来不同的问题,比如:

问题

描述

实例

脏读

Dirty read

也叫未提交读或未确认读。一个事务修改了数据库但未提交或确认,此时另一个事务读取这个值,并且拿去操作。

原来小明的帐户有1元,A负责存入,B负责划帐,那么A先存入20元但未提交,此时B读取这20元,然后划去5元,A失败回滚事务,B则将15元存入数据库,完成事务。而小明就开心坏了。

不可重读

Nonrepeatable read

也叫不一致读或不可再读。一个事务读取了某个值,当它下次再读时这个值变化了,而修改不是它主导的,显然是其他事务操作了

这次B学聪明了,在第一次获得20元的信息之后先减去自己的5元,然后没有立即更新数据库,又去查了一次数据库,而原先的20现在变成了50,三秒之后B发现已经是10了,所以B很纳闷:不是我负责划帐的吗?

幻影

Phantom

是指对同一数据库的两次读操作中发现出现一组新的数据。与不可重读的区别是,不可重读是对现有数据的修改或覆盖,没有增加或减少数据,幻影则是插入了先前没有的数据或删除了原先已有的数据。

B有时也负责向小明报告他最新的存款情况,虽然昨天没睡好,但是B仍然进行了统计,他发现第一次统计时A5笔记录自己有10笔,第二次查询确认时发现A增加了3笔共有8笔自己少了月初的一笔成了9笔,B想自己应该休息一会再统计一次,尽管少了月初的一笔有些奇怪,但如果结果是A的总数大于自己的,那小明对他的存款还是会有信心的

下面的表是设置不同的隔离选项对并发发生的问题接受程度,看得出Serializable 最严格,三种可能的错误都不会发生。COM+按其顺序依次认为它们从低到高隔离值从小到大,Read uncommitted最小,Serializable最大。

Isolation level

发生脏读

发生不可重读

发生幻影

Read uncommitted

Yes

Yes

Yes

Read committed

No

Yes

Yes

Repeatable read

No

No

Yes

Serializable

No

No

No

 

(未完) 


特别:

本文优快云署名首发,转载或改编请注明作者和出处。如果有问题,请发电子邮件给new2001@msn.com

以上文字和图片涉及其他人的隐私和个人权利,所有文字和图片只用于内部交流,不作任何新闻发表和商业用途。

<think>我们正在解决.NET安装过程中出现的错误:“一个或多个要求的事务成员不存在”。根据经验,这个问题通常与Windows Installer服务、系统文件损坏或.NET Framework安装文件损坏有关。以下是逐步的解决方案: ### 步骤1:重启计算机并重试安装 有时问题可能是暂时的,重启计算机后重运行安装程序可能解决问题[^1]。 ### 步骤2:运行Windows Installer修复工具 1. 按`Win+R`打开运行窗口,输入`services.msc`并回车。 2. 找到`Windows Installer`服务,确保其状态为“正在运行”。如果没有,右键选择“启动”。 3. 如果服务无法启动,可能需要重注册Windows Installer: - 以管理员身份打开命令提示符(CMD)。 - 依次执行以下命令: ```cmd msiexec /unregister msiexec /regserver ``` ### 步骤3:检查并修复系统文件 使用系统文件检查器(SFC)部署映像服务管理(DISM)工具修复系统文件: 1. 以管理员身份打开命令提示符。 2. 运行SFC扫描:`sfc /scannow` 3. 如果SFC无法修复,运行DISM工具: ```cmd DISM /Online /Cleanup-Image /RestoreHealth ``` 4. 完成后重启计算机,再次尝试安装.NET。 ### 步骤4:清理临时文件并重置Windows Installer缓存 1. 删除临时文件: - 按`Win+R`,输入`%temp%`并回车,删除该文件夹内所有文件。 2. 重置Windows Installer缓存: - 停止`Windows Installer`服务(在服务管理器中停止)。 - 删除`C:\Windows\Installer`文件夹中的所有文件(注意:这是系统隐藏文件夹,需要显示隐藏文件)。 - 重启动`Windows Installer`服务。 ### 步骤5:手动下载.NET安装包 从微软官方下载中心重下载.NET Framework安装程序,确保文件完整[^2]。 ### 步骤6:使用.NET修复工具 下载并运行微软官方的.NET Framework修复工具(Microsoft .NET Framework Repair Tool),它可以自动检测修复常见的.NET安装问题[^3]。 ### 步骤7:检查事件查看器 如果上述步骤无效,检查Windows事件查看器(Event Viewer)中的应用程序日志,查找与安装失败相关的详细错误信息,以便进一步排查。 ### 总结 通过以上步骤,大多数情况下可以解决“.NET安装错误:一个或多个要求的事务成员不存在”的问题。如果问题仍然存在,可能需要考虑系统还原或重装操作系统。 §§相关问题§§ 1. 如何手动卸载已损坏的.NET Framework版本? 2. Windows Installer服务无法启动怎么办? 3. 如何使用DISM工具修复Windows系统镜像?</think>### 解决.NET安装错误"一个或多个要求的事务成员不存在"的方法 该错误通常由 Windows Installer 服务异常、系统文件损坏或安装包不完整引起,以下是系统性的解决方案: #### 1. **重启Windows Installer服务** - 按 `Win+R` 输入 `services.msc` - 找到 **Windows Installer** 服务 - 右键选择 **重启动** - 若服务被禁用,改为**自动**启动类型并启动[^1] #### 2. **修复系统文件** ```cmd :: 以管理员身份运行CMD sfc /scannow DISM /Online /Cleanup-Image /RestoreHealth ``` 完成后重启系统,再次尝试安装.NET[^2] #### 3. **清理安装缓存** ```cmd net stop msiserver rd /s /q %windir%\Installer reg delete HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer /f net start msiserver ``` #### 4. **重置.NET安装状态** - 下载 [.NET Framework Cleanup Tool](https://github.com/microsoft/dotnet-framework-cleanup) - 选择对应的.NET版本执行清理 - 重启后重运行安装程序 #### 5. **手动安装依赖项** ```powershell # 安装Windows依赖 Install-WindowsFeature Net-Framework-Core -Source "D:\sources\sxs" ``` > 需指定Windows安装镜像中的`sxs`文件夹路径 #### 6. **修复注册表权限** ```cmd secedit /configure /cfg %windir%\inf\defltbase.inf /db defltbase.sdb /verbose ``` #### 7. **使用离线安装包** - 从[微软官网](https://dotnet.microsoft.com/download/dotnet-framework)下载离线安装包 - 断开网络后运行安装(避免在线验证失败) > ⚠️ 若仍失败,检查事件查看器(`eventvwr.msc`)中 **Application** 日志的详细错误代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值