5 threads create each 50 Child objects and adds, gets and removes them
from a Parent Dictionary.
A KeyNotFoundException occurs _sometimes_ when getting a Child.
The KeyNotFoundException does not occur when only adding and getting
(not removing)
Reproducible in NHibernate 2.0.1GA, 2.1.0GA and trunk.
With and without lazy loading.
Is there a bug in my code or NHibernate?
Thanks,
Marcel
Code for each thread:
for (Int32 iterationIndex = 0; iterationIndex < iterationCount;
iterationIndex++)
{
int key = (threadIndex * 100) + iterationIndex;
// Add new Child to Parent
ISession session1 = sessionManager.SessionFactory.OpenSession();
ITransaction transaction1 = session1.BeginTransaction();
Parent parent1 = session1.Get<Parent>(1L);
Child child1 = new Child();
parent1.Childs.Add(key, child1);
transaction1.Commit();
session1.Close();
// Get Child from Parent
ISession session2 = sessionManager.SessionFactory.OpenSession();
ITransaction transaction2 = session2.BeginTransaction();
Parent parent2 = session2.Get<Parent>(1L);
Child child2 = parent2.Childs[key]; ----------->>>>>>>>>>>>>>
KeyNotFoundException (sometimes)
transaction2.Commit();
session2.Close();
// Remove Child from Parent
ISession session3 = sessionManager.SessionFactory.OpenSession();
ITransaction transaction3 = session3.BeginTransaction();
Parent parent3 = session3.Get<Parent>(1L);
parent3.Childs.Remove(key);
transaction3.Commit();
session3.Close();
}
Mapping:
<class name="Parent">
<id name="Id">
<generator class="assigned"/>
</id>
<map name="Childs" cascade="save-update" optimistic-lock="false"
lazy="false">
<key column="ParentId"/>
<index column="ParentIndex" type="int"/>
<one-to-many class="Child"/>
</map>
</class>
<class name="Child">
<id name="Id">
<generator class="native" />
</id>
<version name="Version" />
</class>
Exception:
System.Collections.Generic.KeyNotFoundException was unhandled
Message="The given key was not present in the dictionary."
Source="mscorlib"
StackTrace:
at System.ThrowHelper.ThrowKeyNotFoundException()
at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
at
NHibernate.Collection.Generic.PersistentGenericMap`2.System.Collections.Generic.IDictionary<TKey,TValue>.get_Item
(TKey key)
at
NHibernateConcurrencyStressTest.ConcurrencyTest.ThreadContainer.Test()
at System.Threading.ThreadHelper.ThreadStart_Context(Object
state)
at System.Threading.ExecutionContext.Run(ExecutionContext
executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---