8
8
//------------------------------------------------------------------------------
9
9
10
10
11
+ using System ;
11
12
using System . Data ;
12
13
using NHibernate . Cfg ;
13
14
using NHibernate . Dialect ;
14
15
using NHibernate . Driver ;
15
16
using NHibernate . Engine ;
16
17
using NUnit . Framework ;
17
18
using NUnit . Framework . Constraints ;
19
+ using Environment = NHibernate . Cfg . Environment ;
18
20
19
21
namespace NHibernate . Test . NHSpecificTest . NH1553 . MsSQL
20
22
{
@@ -40,40 +42,34 @@ private ITransaction BeginTransaction(ISession session)
40
42
41
43
private async Task < Person > LoadPersonAsync ( CancellationToken cancellationToken = default ( CancellationToken ) )
42
44
{
43
- using ( ISession session = OpenSession ( ) )
45
+ using ( var session = OpenSession ( ) )
46
+ using ( var tr = BeginTransaction ( session ) )
44
47
{
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 ;
51
51
}
52
52
}
53
53
54
54
private async Task SavePersonAsync ( Person p , CancellationToken cancellationToken = default ( CancellationToken ) )
55
55
{
56
- using ( ISession session = OpenSession ( ) )
56
+ using ( var session = OpenSession ( ) )
57
+ using ( var tr = BeginTransaction ( session ) )
57
58
{
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 ) ) ;
64
62
}
65
63
}
66
64
67
65
private void SavePerson ( Person p )
68
66
{
69
- using ( ISession session = OpenSession ( ) )
67
+ using ( var session = OpenSession ( ) )
68
+ using ( var tr = BeginTransaction ( session ) )
70
69
{
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 ( ) ;
77
73
}
78
74
}
79
75
@@ -159,13 +155,27 @@ protected override bool AppliesTo(ISessionFactoryImplementor factory)
159
155
return factory . ConnectionProvider . Driver is SqlClientDriver ;
160
156
}
161
157
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
+
162
172
private void SetAllowSnapshotIsolation ( bool on )
163
173
{
164
- using ( ISession session = OpenSession ( ) )
174
+ using ( var session = OpenSession ( ) )
175
+ using ( var command = session . Connection . CreateCommand ( ) )
165
176
{
166
- var command = session . Connection . CreateCommand ( ) ;
167
177
command . CommandText = "ALTER DATABASE " + session . Connection . Database + " set allow_snapshot_isolation "
168
- + ( on ? "on" : "off" ) ;
178
+ + ( on ? "on" : "off" ) ;
169
179
command . ExecuteNonQuery ( ) ;
170
180
}
171
181
}
@@ -174,7 +184,9 @@ protected override void OnSetUp()
174
184
{
175
185
base . OnSetUp ( ) ;
176
186
177
- SetAllowSnapshotIsolation ( true ) ;
187
+ CheckAllowSnapshotIsolation ( ) ;
188
+ if ( ! _isSnapshotIsolationAlreadyAllowed )
189
+ SetAllowSnapshotIsolation ( true ) ;
178
190
179
191
person = new Person ( ) ;
180
192
person . IdentificationNumber = 123 ;
@@ -183,18 +195,15 @@ protected override void OnSetUp()
183
195
184
196
protected override void OnTearDown ( )
185
197
{
186
- using ( ISession session = OpenSession ( ) )
198
+ using ( var session = OpenSession ( ) )
199
+ using ( var tr = session . BeginTransaction ( IsolationLevel . Serializable ) )
187
200
{
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 ( ) ;
195
203
}
196
204
197
- SetAllowSnapshotIsolation ( false ) ;
205
+ if ( ! _isSnapshotIsolationAlreadyAllowed )
206
+ SetAllowSnapshotIsolation ( false ) ;
198
207
199
208
base . OnTearDown ( ) ;
200
209
}
@@ -206,4 +215,4 @@ protected override void Configure(Configuration configuration)
206
215
typeof ( SQLUpdateConflictToStaleStateExceptionConverter ) . AssemblyQualifiedName ) ;
207
216
}
208
217
}
209
- }
218
+ }
0 commit comments