2011-03-22 5 views
1

J'ai un peu de mal à faire fonctionner une transaction multi-suppressions en utilisant SubSonic dans un serveur ASP.NET/SQL 2005. Il semble que les modifications soient toujours effectuées dans la base de données même sans appelez la méthode complète sur l'objet transactionscope? J'ai lu les articles à ce sujet et essayé diverses alternatives (en changeant l'ordre de mes instructions d'utilisation), en utilisant DTC, en n'utilisant pas DTC etc mais pas de joie jusqu'à maintenant.Problème de transaction avec SubSonic

Je vais supposer que c'est mon code qui est le problème, mais je ne peux pas identifier le problème - quelqu'un peut-il m'aider? J'utilise SubSonic 2.2. Exemple de code ci-dessous:

using (TransactionScope ts = new TransactionScope()) 
      { 
       using (SharedDbConnectionScope sts = new SharedDbConnectionScope()) 
       { 
        foreach (RelatedAsset raAsset in relAssets) 
        { 
         // grab the asset id: 
         Guid assetId = new Select(RelatedAssetLink.AssetIdColumn) 
          .From<RelatedAssetLink>() 
          .Where(RelatedAssetLink.RelatedAssetIdColumn).IsEqualTo(raAsset.RelatedAssetId).ExecuteScalar<Guid>(); 

         // step 1 - delete the related asset: 
         new Delete().From<RelatedAsset>().Where(RelatedAsset.RelatedAssetIdColumn).IsEqualTo(raAsset.RelatedAssetId).Execute(); 

         // more deletion steps... 
        } 

        // complete the transaction: 
        ts.Complete(); 
       } 
      } 

Répondre

1

L'ordre de vos déclarations à l'aide est correcte (je me souviens moi-même l'ordre avec cette astuce: La connexion a besoin de savoir sur l'opération, il est créé, et il le fait en cochant `système .Transactions.Transaction.Current).

Un indice: vous n'avez pas besoin d'utiliser de doubles crochets. Et vous n'avez pas besoin d'une référence à SharedDbConnectionScope(). Cela semble beaucoup plus lisible.

using (var ts = new TransactionScope()) 
using (new SharedDbConnectionScope()) 
{ 
    // some db stuff 

    ts.Complete(); 
} 

De toute façon, je ne vois pas, pourquoi cela ne devrait pas fonctionner. Si le problème est lié au MSDTC, une exception se produit.

Je ne pouvais qu'imaginer qu'il y avait un problème dans la configuration SqlServer 2005 mais je ne suis pas un expert SqlServer.

Peut-être que vous devriez essayer un code de démonstration pour vérifier que les transactions fonctionnent:

using (var conn = new SqlConnection("your connection String"); 
{ 
    conn.Open(); 
    var tx = conn.BeginTransaction(); 

    using (var cmd = new SqlCommand(conn) 
     cmd.ExecuteScalar("DELETE FROM table WHERE id = 1"); 

    using (var cmd2 = new SqlCommand(conn) 
     cmd2.ExecuteScalar("DELETE FROM table WHERE id = 2"); 


    tx.Commit(); 
} 

Et subsoniques supports de transactions indigènes sans utiliser TransactionScope: http://subsonicproject.com/docs/BatchQuery