From: <jul...@us...> - 2010-09-13 16:31:53
|
Revision: 5183 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=5183&view=rev Author: julian-maughan Date: 2010-09-13 16:31:46 +0000 (Mon, 13 Sep 2010) Log Message: ----------- Fixed bug where an IPostUpdateEventListener.OnPostUpdate event causes an enumeration error in ActionQueue.ExecuteActions. In the event, an ExecuteUpdate criteria statement causes a flush to occur during a flush already initiated by transaction commit. This results in an earlier-than-expected call to ActionQueue.ClearFromFlushNeededCheck, resetting its list of updates before it has finished iterating them (ref. NH-2322). Thanks Filip Zawada for the solution. Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Engine/ActionQueue.cs trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Added Paths: ----------- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/Fixture.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/Mappings.hbm.xml trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/Model.cs trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/PostUpdateEventListener.cs Modified: trunk/nhibernate/src/NHibernate/Engine/ActionQueue.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/ActionQueue.cs 2010-09-12 00:40:28 UTC (rev 5182) +++ trunk/nhibernate/src/NHibernate/Engine/ActionQueue.cs 2010-09-13 16:31:46 UTC (rev 5183) @@ -109,8 +109,9 @@ private void ExecuteActions(IList list) { - foreach (IExecutable executable in list) - Execute(executable); + int size = list.Count; + for (int i = 0; i < size; i++) + Execute((IExecutable)list[i]); list.Clear(); session.Batcher.ExecuteBatch(); Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/Fixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/Fixture.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/Fixture.cs 2010-09-13 16:31:46 UTC (rev 5183) @@ -0,0 +1,51 @@ +using NHibernate.Cfg; +using NUnit.Framework; +using NHibernate.Event; +using System.Diagnostics; + +namespace NHibernate.Test.NHSpecificTest.NH2322 +{ + [TestFixture] + public class Fixture : BugTestCase + { + protected override void Configure(Configuration configuration) + { + configuration.SetProperty(Environment.FormatSql, "false"); + configuration.SetListener(ListenerType.PostUpdate, new PostUpdateEventListener()); + } + + protected override void OnTearDown() + { + using (ISession s = OpenSession()) + { + s.Delete("from Person"); + s.Flush(); + } + base.OnTearDown(); + } + + [Test] + public void ShouldNotThrowWhenCommitingATransaction() + { + int id; + + using (ISession s = OpenSession()) + using (ITransaction t = s.BeginTransaction()) + { + var p = new Person { Name = "inserted name" }; + s.Save(p); + id = p.Id; + t.Commit(); + } + + using (ISession s = OpenSession()) + using (ITransaction t = s.BeginTransaction()) + { + var p = s.Get<Person>(id); + p.Name = "changing the name..."; + + Assert.That(delegate() { t.Commit(); }, Throws.Nothing); + } + } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/Mappings.hbm.xml =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/Mappings.hbm.xml (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/Mappings.hbm.xml 2010-09-13 16:31:46 UTC (rev 5183) @@ -0,0 +1,14 @@ +<?xml version="1.0" encoding="utf-8" ?> +<hibernate-mapping + xmlns="urn:nhibernate-mapping-2.2" + assembly="NHibernate.Test" + namespace="NHibernate.Test.NHSpecificTest.NH2322"> + + <class name="Person"> + <id name="Id"> + <generator class="native" /> + </id> + <property name="Name"/> + </class> + +</hibernate-mapping> \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/Model.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/Model.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/Model.cs 2010-09-13 16:31:46 UTC (rev 5183) @@ -0,0 +1,8 @@ +namespace NHibernate.Test.NHSpecificTest.NH2322 +{ + public class Person + { + public virtual int Id { get; set; } + public virtual string Name { get; set; } + } +} \ No newline at end of file Added: trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/PostUpdateEventListener.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/PostUpdateEventListener.cs (rev 0) +++ trunk/nhibernate/src/NHibernate.Test/NHSpecificTest/NH2322/PostUpdateEventListener.cs 2010-09-13 16:31:46 UTC (rev 5183) @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Text; +using NHibernate.Event; + +namespace NHibernate.Test.NHSpecificTest.NH2322 +{ + public class PostUpdateEventListener : IPostUpdateEventListener + { + void IPostUpdateEventListener.OnPostUpdate(PostUpdateEvent @event) + { + if (@event.Entity is Person) + { + @event.Session + .CreateSQLQuery("update Person set Name = :newName") + .SetString("newName", "new updated name") + .ExecuteUpdate(); + } + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-09-12 00:40:28 UTC (rev 5182) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2010-09-13 16:31:46 UTC (rev 5183) @@ -477,6 +477,9 @@ <Compile Include="NHSpecificTest\NH2302\StringLengthEntity.cs" /> <Compile Include="NHSpecificTest\NH2303\Fixture.cs" /> <Compile Include="NHSpecificTest\NH2303\Model.cs" /> + <Compile Include="NHSpecificTest\NH2322\Fixture.cs" /> + <Compile Include="NHSpecificTest\NH2322\Model.cs" /> + <Compile Include="NHSpecificTest\NH2322\PostUpdateEventListener.cs" /> <Compile Include="TypesTest\CharClass.cs" /> <Compile Include="TypesTest\CharClassFixture.cs" /> <Compile Include="TypesTest\DateTimeClass.cs" /> @@ -1755,6 +1758,7 @@ <EmbeddedResource Include="NHSpecificTest\NH2224\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2279\Mappings.hbm.xml" /> <EmbeddedResource Include="NHSpecificTest\NH2111\Mappings.hbm.xml" /> + <EmbeddedResource Include="NHSpecificTest\NH2322\Mappings.hbm.xml" /> </ItemGroup> <ItemGroup> <ProjectReference Include="..\NHibernate.ByteCode.Castle\NHibernate.ByteCode.Castle.csproj"> @@ -2601,6 +2605,7 @@ <ItemGroup> <Folder Include="NHSpecificTest\NH2111" /> <Folder Include="NHSpecificTest\NH2279" /> + <Folder Include="NHSpecificTest\NH2322" /> <Folder Include="Properties\" /> </ItemGroup> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |