MTS/COM+开发经验谈

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的图示

clip_image002

    • 所以如果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)

原文:大专栏  MTS/COM+开发经验谈


猜你喜欢

转载自www.cnblogs.com/chinatrump/p/11505532.html