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) 跨網域設1AllowOnlySecureRpcCalls(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:從零開始的軟體開發生活」
請大家繼續支持 ^_^