MTS/COM+开发经验谈
- 造成DB Dead Lock问题
- ClassA是对Table1做异动的动作,它的Transaction是Support Transaction;ClassB则是对Table1做查询的动作,它的Transaction是No Transaction。而当ClassUCO(为Require Transaction)中的Method1要去异动Table1后再把它的数据Fetch出来时,便会先Call ClassA异动Table1的数据,再去Call ClassB去Fetch Table1的数据,去达到此目的。 以下是MTS的图示
- 所以如果ClassB中的SQL对Table1没有加(Nolock)的话,便会被ClassUCO的Transaction Lock住,所以要等到ClassUCO把Lock放掉才可以进行Fetch数据,而问题是ClassUCO却要等ClassB去Fetch数据后,才会被Release。所以啦! Lock就这样产生啦! 所以我们在设定Component的异动型态时,要考虑一下这种情形哦!
- MTS中的Root Component会转不停
- 当调用完了Method后,大家都Free掉了,但是在MTS中的Root Component却一直转,没有启动也没有调用。如果是这情形的话,可能是这个Root Component的Method中Call粉多放在不同套件中的Component,所以可以把它们都放在同一个套件中试试看。 依据CRD艾洛克的说法,可能是这个Root Component无法得知其他的对象已经Free掉了,而一直在等待。
- 对象在MTS中,在Registry中也有注册,就是Create不起来
- 那就把那个套件砍掉,再重新建立一个新的套件,再把Dll拉进去。如果还是不行的话那就把所有的套件砍掉,再重做一次。
- 错误代码 = -2147168246 er.NativeError=0 错误描述 = 在指定异动协调员中无法编列新异动
- 设MSDTC→调整DWORD值
TurnOffRpcSecurity(1) 跨网域设1
AllowOnlySecureRpcCalls(0) => 这个可以不用新增,所以直接删除
FallbackToUnseureRpcIfNecessary(0) => 这个可以不用新增,所以直接删除
【DBSERVER有两张网卡,其中一张网段与AP SERVER相同,所以两台主机都要设定】
MSDTC→security新增DWORD值
NetworkDtcAccessInbound(1) => 这个可以不用新增,所以直接删除
NetworkDtcAccessOutBound(1) => 这个可以不用新增,所以直接删除
上述的4项设定在WIN2003中会与 TurnOffRpcSecurity(1) 跨网域设1 相抵触,所以要删掉。
MSDTC→检查 (装机后的默认值即是1)
NetworkDtcAccess(1)
NetworkDtcAccessTransactions(1)
- 设MSDTC→调整DWORD值
原文:大专栏 MTS/COM+开发经验谈