MTS/COM+開發經驗談

  • 10819
  • 0
  • COM+
  • 2010-01-25

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)

Hi, 

亂馬客Blog已移到了 「亂馬客​ : Re:從零開始的軟體開發生活

請大家繼續支持 ^_^