Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comprendre les délais d'attente transactionscope

Essayez de le voir de cette façon :

La longueur de la transaction n'est déterminée que lorsque vous appelez trans.Complete() ou quittez la portée de la transaction. Prenez le code suivant :

using (var trans= new TransactionScope())
{
Threading.Sleep(99999);
trans.Complete()
}

Il n'y a aucun moyen de lancer une exception de délai d'attente à l'intérieur de la routine de veille et cela n'aurait aucun sens si c'était le cas. Ainsi, l'utilisation des délais d'expiration des transactions (au moins de cette façon) ne peut que garantir que si la transaction prend plus de temps que votre délai d'expiration, elle ne sera pas validée.

Si vous n'exécutez qu'une seule requête (pour laquelle je ne saurais pas pourquoi vous utilisez les transactions), vous pouvez définir le délai d'expiration de la requête/commande (ou peu importe comment vous l'appelez). IIRC, votre requête reviendra immédiatement après l'expiration du délai.

Une autre façon serait de définir le délai d'expiration de votre demande de service Web et de supposer simplement que le service Web met trop de temps à répondre à cause de tout ce qui se trouvait dans votre transaction.

EDIT :Vous pouvez essayer :

  • Générer votre transaction sur un thread différent, puis attendre qu'elle se termine (en utilisant Thread.Join(timeout)) sur votre thread principal (celui utilisé par l'appel du service Web). Donc, s'il ne se termine pas avant le délai d'attente que vous avez spécifié, vous pouvez arrêter d'attendre et renvoyer une erreur de délai d'attente (n'oubliez pas de signaler à l'autre thread d'abandonner la transaction).
  • En supposant que vous n'effectuez que des requêtes SQL à l'intérieur de ces transactions, vous pouvez utiliser le mot-clé "BEGIN TRANSACTION" pour spécifier la transaction dans le script sql (hacky en effet). Ensuite, vous pouvez simplement spécifier le délai d'expiration de la commande et exécuter tout cela en une seule ligne de code. Mais cela vous oblige à déplacer tout ce que vous faites à l'intérieur de la transaction dans un script sql, ce qui peut ou non être possible pour vous... et ce n'est pas propre.