This is a simplified example, from my understanding the call to session.Update is not necessary I know that. The whole thing is built with NServiceBus and there is a distributed transaction going on around the message handler. I also insertet that local transaction to make sure it's not the distributed transaction that's causing the problem.
I checked with NHProf that all transactions get committed, and verified there are no errors thrown by the code. There is also no batch processing since I can replicate the problem with only one Message coming in on the Bus. That's exactly what NSB does by default: when a message is received begin the transaction. when a message is completed without error commit. when a message is completed with error rollback. when a message completes dispose of the transaction. Also looking at NHprof I don't see unnecessary sessions being opened. One per Message that's the way I want it to be. Sessions are not re-used from message to message, they are registered within Windsor as Transient. That's why I can't really figure out where the problem is. Everything looks fine to me.. On Sat, Sep 11, 2010 at 4:05 AM, Jason Meckley <[email protected]>wrote: > you don't need to call session.Update(). you should also call > tx.Rollback() if there is an error. > > using(var tx = session.BeginTransaction()) > try > { > session.Get<Product>(id); > product.Name = ... > tx.Commit(); > } > catch > { > tx.Rollback(); > throw; > } > > if you are using a messaging framework, then you can move the > transaction management to the command/message module (or whatever the > name of it is. > > when a message is received begin the transaction. > when a message is completed without error commit. > when a message is completed with error rollback. > when a message completes dispose of the transaction. > > then you message handler code looks like this > > session.Get<Product>(id); > product.Name = ... > > clean, simple code. > > another thing to consider... are you processing messages is batch? if > so you may be opening more sessions then necessary. this is the case > with Rhino.ServiceBus. You can manage if a session is open or not with > CurrentSessionContext. > > CurrentSessionContext.Bind(factory.OpenSession()) > CurrentSessionContext.HasBind(factory); > CurrentSessionContext.Unbind(factory).Dispose(); > > var sessionfactory.GetCurrentSession(); > > > On Sep 10, 8:34 pm, Daniel Hölbling <[email protected]> wrote: > > I've just spent almost 3 hours debugging and still can't find a fault > with > > my code. > > > > The reproduction looks like this: > > > > using (var tx = session.BeginTransaction()) > > { > > var product = session.Get<Product>(message.ProductDto.Id); > > product.Name = message.ProductDto.Name; > > product.PartNumber = message.ProductDto.PartNumber; > > product.Price = message.ProductDto.Price; > > session.Update(product); > > tx.Commit(); > > Logger.InfoFormat("Updated Product {0}", product.Id); > > > > } > > > > I change some value of the entity in the UI, this code is run (over the > > wire) and the IsDirty() Method is set to False and no Update is > generated. > > (Checked with NHProf..) > > I just re-checked and upon changing the value of product.PartNumber for 8 > > times it didn't generate a UPDATE once. > > > > It gets significantly worse once I run this with distributed transactions > > from NServiceBus where I loose every second UPDATE to the database > without > > any error or anything.. It just doesn't update the DB since it doesn't > think > > the session is dirty. > > > > Is there anything I should be aware of? > > > > greetings Daniel > > -- > You received this message because you are subscribed to the Google Groups > "nhusers" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]<nhusers%[email protected]> > . > For more options, visit this group at > http://groups.google.com/group/nhusers?hl=en. > > -- You received this message because you are subscribed to the Google Groups "nhusers" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/nhusers?hl=en.
