2009-05-18 17 views
1

Oracle 11gデータベースを使用しています。私はタグ付けされたサービスを有する:TransactionTimeout with Oracle 11g

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall、TransactionTimeout = "〇時00分10秒")]

自体は次のように見える方法:

[OperationBehavior(TransactionScopeRequired = true)] 
    [TransactionFlow(TransactionFlowOption.NotAllowed)] 
    public OrderMessage AddOrder(OrderMessage orderMessage) 
    { 
     ValidateMessage(orderMessage); 
     return this.orderBusiness.Add(orderMessage); 
    } 

orderBusiness.Addメソッドにブレークポイントを置き、10秒待ってから、トランザクションがタイムアウトします。ブレークポイントを取り出してから、トランザクションに関係するテーブルをロックすると、少なくとも60秒でサービスがタイムアウトするまでは、10秒以上待つことになります。テーブルがロックされている場合、指定された間隔でトランザクションをタイムアウトする方法

答えて

0

ここで私がこの場合にしなければならなかったことがあります。私は私のトランザクションのロックを待っていたので、私のトランザクションタイムアウトが何の効果もないことが分かった。 distributed_lock_timeoutが私のDBのデフォルトの60秒に設定され、その前にサービスがタイムアウトしていたので、私はこれを知らなかった。私はDISTRIBUTED_LOCK_TIMEOUTを変更することができませんでしたので、私はサービスのタイムアウトを増加し、その後、私は見て開始しました:それは、トランザクションが実際に実行するのにかかる時間を気にするので、私はブレークポイントを持っていたとき

InnerException: Oracle.DataAccess.Client.OracleException 
Message="ORA-02049: timeout: distributed transaction waiting for lock" 

だから要約では、transactiontimeoutが働い

。実行を開始していないため、テーブルがロックされても効果はありませんでした。私はtry catchを使用して、トランザクション処理を開始する前にリソースがロックされていないことを確認する必要があります。

0

NOWAITで挿入を使用すると、ロックされているコードをすぐに制御に戻すことができます。