Étendue de la Transaction échoue avec BeginTransaction dans Oracle : la Connexion est déjà partie d'un local ou d'une transaction distribuée
Avoir ce comportement étrange lors de l'utilisation OracleConnection avec TransactionScope.
Si j'essaie d'utiliser la connexion.BeginTransaction() dans une étendue de transaction-je obtenir simple élégant InvalidOperationException : la Connexion est déjà partie d'un local ou d'une transaction distribuée.
voici un code:
var trxOptions = new TransactionOptions();
trxOptions.IsolationLevel = IsolationLevel.ReadCommitted;
using (var transaction = new TransactionScope(TransactionScopeOption.Required,trxOptions))
{
var c = ConfigurationManager.ConnectionStrings["oracle_test"].ConnectionString;
using (var oracle = new OracleConnection(c))
{
oracle.Open();
using (var tr = oracle.BeginTransaction(System.Data.IsolationLevel.ReadCommitted))
{
var cmd = oracle.CreateCommand();
cmd.CommandText = "INSERT INTO simple_user VALUES('a')";
cmd.ExecuteNonQuery();
tr.Commit();
}
}
//now go to sql server and insert data
transaction.Complete();
}
Si je n'utilise pas BeginTransaction tout fonctionne. Toutes les idées pour le faire fonctionner?
PS: je ne suis pas le fait d'avoir un problème sur le Serveur Sql server.
Modifier
Merci pour les réponses, je suppose que je devrais ajouter un peu modifier pour apporter ma question claire.
Première de toutes, le code que j'ai fourni ci-dessus est la démonstration de problème. Disons que j'ai deux dll MyProject.Oracle.dll et MyProject2.MsSql.dll et je tiens à utiliser des méthodes à l'intérieur de ces dll et ils utilisent db.BeginTransaction(). Si ces dll avaient utilisé TransactionScope ma transaction externe ne sera pas un problème. Répartis transaction doit être traitée sans aucun problème. Mais je ne peux pas changer de code à l'intérieur de dll.
Et pourquoi db.BeginTransaction() fonctionne pour SqlServer, mais pas pour Oracle?
OriginalL'auteur adt | 2011-07-29
Vous devez vous connecter pour publier un commentaire.
J'ai frappé à la même question en conjonction avec NHibernate.
D'autres réponses indiquent de ne pas mélanger les TransactionScope et BeginTransaction. Malheureusement pas de sources à l'appui de cette demande dans les cas où il ajouté. Voici mes recherches:
Comme indiqué sur MSDN (de la recherche pour "mélanger") et dans cette discussion, on ne doit pas mélanger les deux concepts, même pas pour SQL-Server. Pourquoi cela semble fonctionner pour SQL-Server, pour à la fois locale et les transactions distribuées, n'est toujours pas clair pour moi.
Certains semblent penser que ce est une question stupide, mais ça fait du sens en contexte de NHibernate (voir ici, ici et ici).
OriginalL'auteur Piper
TransactionScope et DbConnection.BeginTransaction sont 2 exclusive des moyens de gestion des transactions. Vous utilisez 1 d'entre eux.
Le moment où vous appelez OracleConnection.Ouvert, la connexion oracle est enrôlé dans l'air ambiant, le système de transaction. Tout ce que vous devez faire est d'appeler TransactionScope.Complet(),si vous souhaitez valider la transaction ou de ne pas l'appeler, dans ce cas le système de la transaction est annulée.
Dans le cas où vous ne souhaitez pas inscrire immédiatement sur "Ouvrir", vous pouvez définir la 'inscrire' attribut de chaîne de connexion à "dynamique", puis inscrivez explicitement via un appel à"OracleConnection.EnlistTransaction'
OriginalL'auteur alwayslearning
Vous devriez faire un peu plus de lecture sur
TransactionScope
Tout d'abord l'énumération des
TransactionScopeOption
Nécessaire:
De sorte que la transaction si pas disponible est créée et associée automatiquement.
Ambiante transaction la transaction dans laquelle votre code s'exécute. Vous pouvez obtenir une référence à la température ambiante de la transaction par l'appel de la statique Actuel de la propriété de la catégorie de Transactions.
OriginalL'auteur V4Vendetta
Vous ne devez pas utiliser l'intérieur objet de la Transaction,
TransactionScope
création de déjà-t-il et leComplete
méthode ne les commettre, à l'intérieurBeginTransaction
etCommit
les appels de méthode ne sont pas nécessaires.Comment ça fonctionne si vous suivez cette voie?
OriginalL'auteur Davide Piras