Skip to content

Commit 260c4c9

Browse files
bahusoidhazzik
authored andcommitted
Fix possible thread-safety issue with delayed entity inserts (#2233)
1 parent 01effc3 commit 260c4c9

File tree

2 files changed

+6
-23
lines changed

2 files changed

+6
-23
lines changed

src/NHibernate/Action/DelayedPostInsertIdentifier.cs

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Threading;
23

34
namespace NHibernate.Action
45
{
@@ -15,20 +16,12 @@ namespace NHibernate.Action
1516
[Serializable]
1617
public class DelayedPostInsertIdentifier
1718
{
18-
[ThreadStatic]
19-
private static long _Sequence = 0;
19+
private static long GlobalSequence = 0;
2020
private readonly long sequence;
2121

2222
public DelayedPostInsertIdentifier()
2323
{
24-
lock (typeof(DelayedPostInsertIdentifier))
25-
{
26-
if (_Sequence == long.MaxValue)
27-
{
28-
_Sequence = 0;
29-
}
30-
sequence = _Sequence++;
31-
}
24+
sequence = Interlocked.Increment(ref GlobalSequence);
3225
}
3326

3427
public override bool Equals(object obj)

src/NHibernate/Action/EntityIdentityInsertAction.cs

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ namespace NHibernate.Action
99
[Serializable]
1010
public sealed partial class EntityIdentityInsertAction : AbstractEntityInsertAction
1111
{
12-
private readonly object lockObject = new object();
1312
private readonly bool isDelayed;
1413
private readonly EntityKey delayedEntityKey;
1514
//private CacheEntry cacheEntry;
@@ -19,7 +18,9 @@ public EntityIdentityInsertAction(object[] state, object instance, IEntityPersis
1918
: base(null, state, instance, persister, session)
2019
{
2120
this.isDelayed = isDelayed;
22-
delayedEntityKey = this.isDelayed ? GenerateDelayedEntityKey() : null;
21+
delayedEntityKey = this.isDelayed
22+
? Session.GenerateEntityKey(new DelayedPostInsertIdentifier(), Persister)
23+
: null;
2324
}
2425

2526
public object GeneratedId
@@ -32,17 +33,6 @@ public EntityKey DelayedEntityKey
3233
get { return delayedEntityKey; }
3334
}
3435

35-
private EntityKey GenerateDelayedEntityKey()
36-
{
37-
lock (lockObject)
38-
{
39-
if (!isDelayed)
40-
throw new HibernateException("Cannot request delayed entity-key for non-delayed post-insert-id generation");
41-
42-
return Session.GenerateEntityKey(new DelayedPostInsertIdentifier(), Persister);
43-
}
44-
}
45-
4636
protected internal override bool HasPostCommitEventListeners
4737
{
4838
get

0 commit comments

Comments
 (0)