I was under the impression that the using statement would take care of rollback in case of an exception? And the Update() statement shouldn't be there. Could that explain the situation?
/Oskar 2010/9/11 Jason Meckley <[email protected]>: > 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]. > 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.
