Why does NHibernate throw a "StaleObjectStateException"?

I am writing a project and using NHibernate 3.1

SimpleTest:

Forum forum = Session.CreateCriteria<Forum>().Add(Restrictions.Eq("UrlName", "reportabug")).UniqueResult<Forum>(); forum.TopicsCount++; IForumRepository forumRepository = new ForumRepository(SessionFactory); forumRepository.Update(forum); public virtual void Update(TEntity entity) { if (!session.Transaction.IsActive) { TResult result; using (var tx = session.BeginTransaction()) { session.SaveOrUpdate(entity) tx.Commit(); } return result; } session.SaveOrUpdate(entity) } 

The latest update throws an exception:

 StaleObjectStateException was unhandled by user code: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) 

SQL query:

 UPDATE Forums SET Name = 'Forums Issues (not product support)' /* @p0 */, UrlName = 'reportabug' /* @p1 */, Description = 'Use this forum to report issues with the online forums application. When reporting an issue please include relevant details such as repro steps, error messages and browser version.' /* @p2 */, CategoryId = 'b2cc232c-0d5c-4f35-bb6f-29c67d7d40c2' /* @p3 */, TopicsCount = 1 /* @p4 */ WHERE ForumId = '864046b7-ca57-48c4-8a81-082103223527' /* @p5 */ 

ForumId is correct. Maybe this is concurrency? Any ideas?

+6
source share
1 answer

StaleObjectStateException is a sleep mode that ensures consistency of the data read by the API here . Hibernate supports version objects that it updates, and throws an error if the version in the database and in memory does not match. Read more about the optimistic locking mechanism.

So, debug the application with this information. I am not familiar with the C# syntax, but I think the second save should be in else .

+5
source

Source: https://habr.com/ru/post/900571/


All Articles