Par Défaut Délai D'Expiration De Transaction
J'ai utilisé pour définir le timeout des Transaction en utilisant TransactionOptions.Délai d'attente, mais ont décidé, pour la facilité d'entretien l'utilisation de la config approche:
<system.transactions>
<defaultSettings timeout="00:01:00" />
</system.transactions>
Bien sûr, après la mise en, j'ai voulu tester il travaillait, et de réduire ainsi le délai d'attente de 5 secondes, puis a couru un test qui a duré plus longtemps que cela - mais la transaction ne semble pas abandonner! Si j'ai ajuster le test pour fixer TransactionOptions.Délai d'attente de 5 secondes, le test fonctionne comme prévu
Après Enquête, je pense que le problème semble se rapporter à TransactionOptions.Le délai d'attente, même si je ne suis plus l'utiliser.
J'ai encore besoin d'utiliser TransactionOptions afin que je puisse régler IsolationLevel, mais je n'ai plus de définir la valeur de Délai d'expiration, si je regarde cet objet après que j'ai créer, la valeur de délai d'expiration est 00:00:00, ce qui équivaut à l'infini. Est-ce à dire ma valeur définie dans le fichier de config est d'être ignoré?
Pour résumer:
- Est-il impossible de mélanger la config
le réglage et l'utilisation de
TransactionOptions - Si non, est-il
de toute façon à extraire le paramètre de configuration
au moment de l'exécution, et d'utiliser cette fonction pour définir le
Propriété Timeout - [Edit] OU Définir la valeur par défaut de niveau d'isolation sans l'aide de TransactionOptions
- Dans ce fichier de configuration avez-vous mis cela? Dans lequel la section de configuration?
- En application.confing directement sous la <configuration> root. Également dans le web.config, mais au-dessus de l'essai était d'application.config.
Vous devez vous connecter pour publier un commentaire.
Vous pouvez mélanger du système.transaction paramètres de configuration et l'utilisation de la
TransactionOption
classe, mais il y a certaines choses que vous devez être conscients de.Ci-dessus est le nœud du problème dans votre cas je pense. Vous êtes à l'aide de la
TransactionOption
pour spécifier le isolement niveau, et comme un effet secondaire que vous obtenez une infini valeur de Délai d'expiration parce que l'infini est la valeur par défaut valeur de Délai d'expiration pourTransactionOption
si elle n'est pas spécifiée. Cependant, je ne suis pas tout à fait sûr pourquoi c'est...il serait judicieux de défaut à la valeur par défaut Délai d'expiration de Transaction.Vous pouvez implémenter votre propre TransactionOptions de la classe helper qui comprend les valeurs par défaut qui sont lus à partir de l'app.config (si présente) ou à défaut à des valeurs raisonnables pour un TransactionOption classe qui peut être utilisée.
Dans tous les cas, vous pouvez limiter cela à l'aide de la système.transaction/machineSettings/maxTimeout valeur. C'est un contexte administratif et ne peut être configuré par le biais de la machine.config. Vous recevrez un ConfigurationException si vous l'essayez, à partir de l'app/web.config.
Avec le maxTimeout jeu, n'importe quelle valeur de délai d'expiration spécifiée, la valeur maximale sera limitée à la maxTimeout valeur. La valeur par défaut maxTimeout est 00:10:00 ou 10 minutes, alors vous ne serait pas en fait jamais avoir à l'infini délai d'expiration d'une transaction.
Vous pouvez également définir la transaction IsolationLevel explicitement sur la connexion de base de données que vous utilisez dans la transaction. Quelque chose comme ceci?
Dans votre test, vous devrez peut-être assurez-vous de reconstruire, de sorte que l'application.la config est régénéré . Dans mes tests, il est apparu que je devais mettre fin à l' *.vshost.exe processus de ramasser le système.configuration de la transaction changement de réglage - bien que j'ai l'impression que peut-être été un coup de chance. Juste pour info..
Vous pouvez obtenir le (validé) délai d'expiration par défaut de la configuration à l'aide
TransactionManager.DefaultTimeout
.TransactionOptions
est une structure qui encapsule le délai d'attente et le niveau d'isolation. Lors de l'initialisation d'un struct en utilisant le constructeur par défaut, il sera toujours initialiser les membres de la structure à leurs valeurs par défaut:Si vous souhaitez spécifier un
IsolationLevel
et utiliser la valeur par défaut délai d'expiration:TransactionManager.DefaultTimeout
est la valeur spécifiée dans le fichier de configuration. La valeur par défaut est en effet de 1 minute et peut être modifié en éditant DefaultSettingsSection.Timeout, sorte de double vérification n'est pas nécessaire!TransactionManager.DefaultTimeout
?Par le Réflecteur, les règles de base pour la fixation d'un délai d'expiration de transaction avec les constructeurs de
TransactionScope
sont comme suit:La DefaultTimeOut est déterminée par la première règle à partir de ci-dessous est satisfaite:
TimeSpan
paramètre, la DefaultTimeout est le paramètreTransactionOption
paramètre, la DefaultTimeout esttransactionOption.TimeOut
TransactionScopeOption
paramètre, la DefaultTimeout estscopeOption.TimeOut
La MaxTimeOut est de 10 minutes, sauf si une autre valeur est spécifiée dans la machine.config.
La efficace timeout de la transaction est plus petite des MaxTimeOut et DefaultTimeOut qui est supérieur à zéro. Si les deux MaxTimeOut et DefaultTimeOut sont à zéro, le délai d'attente est le nombre de tiques représenté par
long.MaxValue
(l'infini).Si le
TransactionScope
instance ne pas créer une nouvelle opération, soit parce qu'une transaction est passée dans son constructeur, ou en raison de l'étendue de transaction option n'en a pas besoin (par exemple, lorsque la température ambiante, la transaction est présent et le TransactionScopeOption est Nécessaire), mais untimeOut
paramètre est encore passé dans le constructeur, un timer est démarré. Lorsque le délai est écoulé, la transaction sous-jacente estTimeOut()
méthode est appelée. Le DefaultTimeOut et MaxTimeOut propriétés ne sont pas utilisés dans ce cas.Si le
transactionScopeOption == TransactionScopeOption.Supress
, le délai d'attente est ignoré et n'a aucun effet.Il est également possible de définir la MaxTimeOut dans le dossier app/web fichier de config, si la section pertinente dans la machine.la config est remplacé (notez les valeurs de la allowDefintion et allowExeDefinition attributs):
Pour une référence rapide, voici les TransactionScope constructeurs:
Le fichier de configuration paramètre est ignoré lorsque TransactionOptions sont utilisés. La création d'un TransactionScope, dans la plupart des cas, de créer une instance de CommittableTransaction. Le pas d'arg constructeur de CommittableTransaction va utiliser le fichier de configuration réglage par défaut délai d'expiration. TransactionScope des constructeurs de prendre un TransactionOptions ou TimeSpan va appeler l'une des surcharges de la CommittableTransaction classe, et non pas le n arg version. Donc, si vous souhaitez utiliser cette valeur, vous devez saisir à partir du fichier de configuration vous-même.
Quand j'ai couru dans ce que j'ai mis le code suivant dans un peu TransactionOptionsFactory classe.
De mettre mes pensées en bas: