I'm not sure you can/should trust even the database engine transaction, if the error originated from there. I know you cannot for some engines at least.
/Oskar 2010/9/14 Diego Mijelshon <[email protected]>: > http://nhforge.org/doc/nh/en/index.html#manipulatingdata-exceptions > "If the ISession throws an exception you should immediately rollback the > transaction, call ISession.Close() and discard the ISession instance. > Certain methods of ISession will not leave the session in a consistent > state." > > Lower level can be StatelessSession, for example. > An alternative is changing your design so you DON'T get exceptions as part > of your regular workflow. > Diego > > > On Tue, Sep 14, 2010 at 15:20, Corey Coogan <[email protected]> wrote: >> >> Would you elaborate what you mean by lower level? You mean working >> directly against ADO? I'm not even sure how to do that with NH if >> that's what you are saying. >> >> On Sep 14, 1:04 pm, Diego Mijelshon <[email protected]> wrote: >> > You can't use a Session to handle this scenario as-is. You'll have to go >> > lower-level. >> > >> > Diego >> > >> > On Tue, Sep 14, 2010 at 14:47, Corey Coogan <[email protected]> wrote: >> > > I have a scenario that I commonly run into. It's simple to do with a >> > > standard ADO Transaction, but not so much with NH (that I know of). >> > >> > > I have 2 tables to update. The first contains profile information >> > > (Profile) and the other (Work) contains records changes that need to >> > > be made and the status of those changes. For each update to the >> > > Profile table, there will be an update to the status on the Work >> > > table. >> > >> > > - If the update to the Profile table fails, I need to update the >> > > status on the Work table. >> > > - If the update to the Profile table succeeds, and the update to the >> > > Work table fails, I need to rollback the transaction. >> > >> > > The problem is that I don't know if the update to the Profile table >> > > failed until I commit the transaction. I tried to do a Flush on the >> > > Profile to catch the exception so I could write the status to the Work >> > > table, but then my Commit fails with the exception caused from the >> > > Profile update. >> > >> > > How can I handle this? In a typical ADO Transaction, my first call >> > > will throw, but I can catch and still update the other tables in the >> > > transaction. >> > >> > > Here's sort of what my code looks like - pretty standard. This is not >> > > my actual code, so please focus on the problem, not that I'm not >> > > disposing my transaction or closing my session ;) : >> > >> > > try >> > > { >> > > ITransaction trans = _session.BeginTransaction(); >> > >> > > var work = _repo.GetWork(); >> > > var profile = _repo.GetProfile(work.ProfileId); >> > >> > > try >> > > { >> > > profile.UpdateWithNewValues(work); >> > > _session.SaveOrUpdate(profile); >> > > _session.Flush(); >> > > work.Status = "Success"; >> > >> > > }catch{ >> > > work.Status = "Failure"; >> > > } >> > >> > > _session.SaveOrUpdate(work); >> > > trans.Commit(); >> > >> > > }catch{ >> > >> > > trans.Rollback(); >> > >> > > } >> > >> > > I realize that Flush() is not going to work, but I don't know how else >> > > to do this. >> > >> > > -- >> > > 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. >> > > -- > 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.
