Skip to content

Commit aacd72c

Browse files
fredericDelaportehazzik
authored andcommitted
Preserve original snapshot mode.
1 parent 05264ba commit aacd72c

File tree

2 files changed

+83
-63
lines changed

2 files changed

+83
-63
lines changed

src/NHibernate.Test/Async/NHSpecificTest/NH1553/MsSQL/SnapshotIsolationUpdateConflictTest.cs

Lines changed: 44 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,15 @@
88
//------------------------------------------------------------------------------
99

1010

11+
using System;
1112
using System.Data;
1213
using NHibernate.Cfg;
1314
using NHibernate.Dialect;
1415
using NHibernate.Driver;
1516
using NHibernate.Engine;
1617
using NUnit.Framework;
1718
using NUnit.Framework.Constraints;
19+
using Environment = NHibernate.Cfg.Environment;
1820

1921
namespace NHibernate.Test.NHSpecificTest.NH1553.MsSQL
2022
{
@@ -40,40 +42,34 @@ private ITransaction BeginTransaction(ISession session)
4042

4143
private async Task<Person> LoadPersonAsync(CancellationToken cancellationToken = default(CancellationToken))
4244
{
43-
using (ISession session = OpenSession())
45+
using (var session = OpenSession())
46+
using (var tr = BeginTransaction(session))
4447
{
45-
using (ITransaction tr = BeginTransaction(session))
46-
{
47-
var p = await (session.GetAsync<Person>(person.Id, cancellationToken));
48-
await (tr.CommitAsync(cancellationToken));
49-
return p;
50-
}
48+
var p = await (session.GetAsync<Person>(person.Id, cancellationToken));
49+
await (tr.CommitAsync(cancellationToken));
50+
return p;
5151
}
5252
}
5353

5454
private async Task SavePersonAsync(Person p, CancellationToken cancellationToken = default(CancellationToken))
5555
{
56-
using (ISession session = OpenSession())
56+
using (var session = OpenSession())
57+
using (var tr = BeginTransaction(session))
5758
{
58-
using (ITransaction tr = BeginTransaction(session))
59-
{
60-
await (session.SaveOrUpdateAsync(p, cancellationToken));
61-
await (session.FlushAsync(cancellationToken));
62-
await (tr.CommitAsync(cancellationToken));
63-
}
59+
await (session.SaveOrUpdateAsync(p, cancellationToken));
60+
await (session.FlushAsync(cancellationToken));
61+
await (tr.CommitAsync(cancellationToken));
6462
}
6563
}
6664

6765
private void SavePerson(Person p)
6866
{
69-
using (ISession session = OpenSession())
67+
using (var session = OpenSession())
68+
using (var tr = BeginTransaction(session))
7069
{
71-
using (ITransaction tr = BeginTransaction(session))
72-
{
73-
session.SaveOrUpdate(p);
74-
session.Flush();
75-
tr.Commit();
76-
}
70+
session.SaveOrUpdate(p);
71+
session.Flush();
72+
tr.Commit();
7773
}
7874
}
7975

@@ -159,13 +155,27 @@ protected override bool AppliesTo(ISessionFactoryImplementor factory)
159155
return factory.ConnectionProvider.Driver is SqlClientDriver;
160156
}
161157

158+
private bool _isSnapshotIsolationAlreadyAllowed;
159+
160+
private void CheckAllowSnapshotIsolation()
161+
{
162+
using (var session = OpenSession())
163+
using (var command = session.Connection.CreateCommand())
164+
{
165+
command.CommandText = $@"select snapshot_isolation_state_desc from sys.databases
166+
where name = '{session.Connection.Database}'";
167+
_isSnapshotIsolationAlreadyAllowed =
168+
StringComparer.OrdinalIgnoreCase.Equals(command.ExecuteScalar() as string, "on");
169+
}
170+
}
171+
162172
private void SetAllowSnapshotIsolation(bool on)
163173
{
164-
using (ISession session = OpenSession())
174+
using (var session = OpenSession())
175+
using (var command = session.Connection.CreateCommand())
165176
{
166-
var command = session.Connection.CreateCommand();
167177
command.CommandText = "ALTER DATABASE " + session.Connection.Database + " set allow_snapshot_isolation "
168-
+ (on ? "on" : "off");
178+
+ (on ? "on" : "off");
169179
command.ExecuteNonQuery();
170180
}
171181
}
@@ -174,7 +184,9 @@ protected override void OnSetUp()
174184
{
175185
base.OnSetUp();
176186

177-
SetAllowSnapshotIsolation(true);
187+
CheckAllowSnapshotIsolation();
188+
if (!_isSnapshotIsolationAlreadyAllowed)
189+
SetAllowSnapshotIsolation(true);
178190

179191
person = new Person();
180192
person.IdentificationNumber = 123;
@@ -183,18 +195,15 @@ protected override void OnSetUp()
183195

184196
protected override void OnTearDown()
185197
{
186-
using (ISession session = OpenSession())
198+
using (var session = OpenSession())
199+
using (var tr = session.BeginTransaction(IsolationLevel.Serializable))
187200
{
188-
using (ITransaction tr = session.BeginTransaction(IsolationLevel.Serializable))
189-
{
190-
string hql = "from Person";
191-
session.Delete(hql);
192-
session.Flush();
193-
tr.Commit();
194-
}
201+
session.Delete("from Person");
202+
tr.Commit();
195203
}
196204

197-
SetAllowSnapshotIsolation(false);
205+
if (!_isSnapshotIsolationAlreadyAllowed)
206+
SetAllowSnapshotIsolation(false);
198207

199208
base.OnTearDown();
200209
}
@@ -206,4 +215,4 @@ protected override void Configure(Configuration configuration)
206215
typeof (SQLUpdateConflictToStaleStateExceptionConverter).AssemblyQualifiedName);
207216
}
208217
}
209-
}
218+
}

src/NHibernate.Test/NHSpecificTest/NH1553/MsSQL/SnapshotIsolationUpdateConflictTest.cs

Lines changed: 39 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
using System;
12
using System.Data;
23
using NHibernate.Cfg;
34
using NHibernate.Dialect;
45
using NHibernate.Driver;
56
using NHibernate.Engine;
67
using NUnit.Framework;
78
using NUnit.Framework.Constraints;
9+
using Environment = NHibernate.Cfg.Environment;
810

911
namespace NHibernate.Test.NHSpecificTest.NH1553.MsSQL
1012
{
@@ -28,27 +30,23 @@ private ITransaction BeginTransaction(ISession session)
2830

2931
private Person LoadPerson()
3032
{
31-
using (ISession session = OpenSession())
33+
using (var session = OpenSession())
34+
using (var tr = BeginTransaction(session))
3235
{
33-
using (ITransaction tr = BeginTransaction(session))
34-
{
35-
var p = session.Get<Person>(person.Id);
36-
tr.Commit();
37-
return p;
38-
}
36+
var p = session.Get<Person>(person.Id);
37+
tr.Commit();
38+
return p;
3939
}
4040
}
4141

4242
private void SavePerson(Person p)
4343
{
44-
using (ISession session = OpenSession())
44+
using (var session = OpenSession())
45+
using (var tr = BeginTransaction(session))
4546
{
46-
using (ITransaction tr = BeginTransaction(session))
47-
{
48-
session.SaveOrUpdate(p);
49-
session.Flush();
50-
tr.Commit();
51-
}
47+
session.SaveOrUpdate(p);
48+
session.Flush();
49+
tr.Commit();
5250
}
5351
}
5452

@@ -134,13 +132,27 @@ protected override bool AppliesTo(ISessionFactoryImplementor factory)
134132
return factory.ConnectionProvider.Driver is SqlClientDriver;
135133
}
136134

135+
private bool _isSnapshotIsolationAlreadyAllowed;
136+
137+
private void CheckAllowSnapshotIsolation()
138+
{
139+
using (var session = OpenSession())
140+
using (var command = session.Connection.CreateCommand())
141+
{
142+
command.CommandText = $@"select snapshot_isolation_state_desc from sys.databases
143+
where name = '{session.Connection.Database}'";
144+
_isSnapshotIsolationAlreadyAllowed =
145+
StringComparer.OrdinalIgnoreCase.Equals(command.ExecuteScalar() as string, "on");
146+
}
147+
}
148+
137149
private void SetAllowSnapshotIsolation(bool on)
138150
{
139-
using (ISession session = OpenSession())
151+
using (var session = OpenSession())
152+
using (var command = session.Connection.CreateCommand())
140153
{
141-
var command = session.Connection.CreateCommand();
142154
command.CommandText = "ALTER DATABASE " + session.Connection.Database + " set allow_snapshot_isolation "
143-
+ (on ? "on" : "off");
155+
+ (on ? "on" : "off");
144156
command.ExecuteNonQuery();
145157
}
146158
}
@@ -149,7 +161,9 @@ protected override void OnSetUp()
149161
{
150162
base.OnSetUp();
151163

152-
SetAllowSnapshotIsolation(true);
164+
CheckAllowSnapshotIsolation();
165+
if (!_isSnapshotIsolationAlreadyAllowed)
166+
SetAllowSnapshotIsolation(true);
153167

154168
person = new Person();
155169
person.IdentificationNumber = 123;
@@ -158,18 +172,15 @@ protected override void OnSetUp()
158172

159173
protected override void OnTearDown()
160174
{
161-
using (ISession session = OpenSession())
175+
using (var session = OpenSession())
176+
using (var tr = session.BeginTransaction(IsolationLevel.Serializable))
162177
{
163-
using (ITransaction tr = session.BeginTransaction(IsolationLevel.Serializable))
164-
{
165-
string hql = "from Person";
166-
session.Delete(hql);
167-
session.Flush();
168-
tr.Commit();
169-
}
178+
session.Delete("from Person");
179+
tr.Commit();
170180
}
171181

172-
SetAllowSnapshotIsolation(false);
182+
if (!_isSnapshotIsolationAlreadyAllowed)
183+
SetAllowSnapshotIsolation(false);
173184

174185
base.OnTearDown();
175186
}
@@ -181,4 +192,4 @@ protected override void Configure(Configuration configuration)
181192
typeof (SQLUpdateConflictToStaleStateExceptionConverter).AssemblyQualifiedName);
182193
}
183194
}
184-
}
195+
}

0 commit comments

Comments
 (0)