** 新事务之一: ** ** dotNET ** ** 和 ** ** COM+ ** ** 中的事务 ** ** **
小气的神
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 继承一个类,那么当我们用 Regsvcs 向 COM+ 注册我们的组件成功后, COM+ 设置中依然有一些默认的值,或是我们使用了属性但没有明确的指明属性的值。这些是由 System.EnterpriseServices.RegistrationHelper 来完成的,事实上 Regsvcs 在调用完 Regasm 和 Tlbexp 之后就调用了它完成在 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 XP ** ** 和 ** ** Windows.NET ** ** 中的可配置事务隔离层( ** ** Configurable Transaction Isolation Level ** ** ) **
Windows XP 和 Widnows.NET 的 COM+ 环境下允许我们指定事务隔离等级 .
这的确是一个盼望已久的新特性, COM+ 1.0 中我们只能使用默认的也是最严格的事务隔离等级: Serializable 。在 Windows XP 和 Windows.NET 中的 COM+ 允许我们指定组件的事务隔离等级,可以由开发人员和实际应用决定使用何种隔离等级。不是所有的 RM ( resource managers )都支持目前的定义的四个隔离等级,可能的一个策略是当 RM 不支持当前的隔离设置那么使用一个更高的隔离等级, Serializable 是最严格的隔离等级,同时也是最普通的一个隔离等级,那么也就是说几乎所有的 RM 都支持这个隔离等级设置(目前 COM+ 支持的四个隔离等级也是 MS SQL Server 都支持和实现的也是 SQL - 92 定义的四个)。同样也不是所有的开发人员都明白这些选项的作用和含义。下面会给出一些通常的解释和信息以便在未来的开发过程中作出选择。
多个用户对数据库操作就可能产生数据不一致的情况了,隔离等级就是说事务可以接受不一致数据的程度,是一个事务与其他事务隔离的程度。较低的隔离级别可以增加并发,但代价是降低数据的正确性。相反,较高的隔离级别可以确保数据的正确性,但可能对并发产生负面影响。我们在 COM+ 中要求的隔离级别确定了 RM 使用锁的行为。不同的隔离等级可能会带来不同的问题,比如:
<TABLE class=MsoTableGrid style="BORDER