88//------------------------------------------------------------------------------
99
1010
11+ using System ;
1112using System . Data ;
1213using NHibernate . Cfg ;
1314using NHibernate . Dialect ;
1415using NHibernate . Driver ;
1516using NHibernate . Engine ;
1617using NUnit . Framework ;
1718using NUnit . Framework . Constraints ;
19+ using Environment = NHibernate . Cfg . Environment ;
1820
1921namespace 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+ }
0 commit comments