2009-05-18 4 views
1

En utilisant une base de données Oracle 11g. J'ai un service qui est étiqueté avec:TransactionTimeout avec Oracle 11g

[ServiceBehavior (InstanceContextMode = InstanceContextMode.PerCall, TransactionTimeout = "00:00:10")]

La méthode elle-même ressemble à ceci:

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

Si je mets un point d'arrêt dans la méthode orderBusiness.Add et attendez 10 secondes, les temps de transaction. Si je prends le point d'arrêt, mais verrouille une table impliquée dans la transaction, il attendra beaucoup plus de 10 secondes, au moins jusqu'à ce que les temps de service à 60 secondes. Des idées comment obtenir une transaction à l'expiration à un intervalle spécifié si la table est verrouillée?

Répondre

0

Voici ce que je devais faire dans ce cas. J'ai trouvé que mon transactiontimeout n'avait aucun effet parce que j'attendais un verrou pour ma transaction. Je ne savais pas ce que parce que distributed_lock_timeout a été mis à la valeur par défaut de 60 secondes dans mon DB et le service avant que le calendrier. Depuis que je ne pouvais pas changer le distributed_lock_timeout j'ai augmenté le délai d'attente de service, puis j'ai commencé à voir:

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

Donc, en résumé, le TransactionTimeout travaillé quand j'avais un point d'arrêt parce qu'il se soucie de la durée de la transaction prend effectivement pour exécuter . Cela n'avait aucun effet lorsque la table était verrouillée car elle n'avait pas encore commencé à s'exécuter. Je devrais utiliser un try catch pour m'assurer que la ressource n'est pas verrouillée avant de commencer mon travail transactionnel.

0

Vous pouvez utiliser un insert avec NOWAIT pour revenir immédiatement le contrôle pour vous si elle est verrouillée et gérer dans votre code.

Questions connexes