2010-06-15 7 views
0

Toutes mes demandes ASP.NET sont enveloppées dans une session et une transaction qui est validée uniquement à la fin de la requête.Vider séparément la transaction Castle ActiveRecord et actualiser l'objet dans une autre transaction

Au cours de l'exécution de la requête, j'aimerais insérer un objet et le rendre visible aux autres threads potentiels, c'est-à-dire diviser l'insertion en une nouvelle transaction, valider cette transaction et continuer.

La raison en est que la requête en question touche une API qui enchaîne alors une autre de mes pages (quasi-synchrone) pour me faire savoir qu'elle a traité, et donc double un enregistrement de transaction, car la requête initiale pas encore terminé, et donc pas commis le dossier de transaction.

J'ai essayé envelopper le code d'insertion avec une nouvelle SessionScope, TransactionScope (TransactionMode.New), combinaison des deux, tout rinçage manuellement, etc.

Cependant, quand je l'appelle Actualiser sur l'objet I » Je reçois toujours l'ancien état d'objet.

Voici quelques exemple de code pour ce que je vois:

Post outsidePost = Post.Find(id); // status of this post is Status.Old 
using (TransactionScope transaction = new TransactionScope(TransactionMode.New)) 
{ 
    Post p = Post.Find(id); 
    p.Status = Status.New; // new status set here 
    p.Update(); 

    SessionScope.Current.Flush(); 
    transaction.Flush(); 
    transaction.VoteCommit(); 
} 
outsidePost.Refresh(); 
// refresh doesn't get the new status, status is still Status.Old 

Toutes les suggestions, idées et commentaires sont appréciés!

Répondre

0

J'ai déjà eu un problème similaire, lié aux niveaux d'isolation. Le niveau d'isolation par défaut a été défini sur "Snapshot", et lors de l'exécution sur SQL Server, cela signifiait que la première transaction ne verrait rien qui ait changé depuis son démarrage. Peut-être que c'est votre niveau d'isolement?

Si ce n'est pas le cas, essayez de créer une toute nouvelle TransactionScope directement après avoir disposé celle ci-dessus, et voyez si vous pouvez la lire comme nouvelle. Si vous ne pouvez pas, ce n'est probablement rien à voir avec la transaction extérieure.

Espérons que ça aide.

Marcus

+0

Merci Marcus, essayé déjà mais malheureusement, il n'a pas fait l'affaire. Je viens de finir par truquer tout ça en dehors d'ActiveRecord. – eanticev

Questions connexes