44// Created by: Denis Krjuchkov
55// Created: 2009.11.26
66
7+ using System . Collections . Generic ;
8+ using System . Linq ;
79using NUnit . Framework ;
810using Xtensive . Core ;
911using Xtensive . Orm . Providers ;
@@ -13,10 +15,12 @@ namespace Xtensive.Orm.Tests.Storage
1315{
1416 public class NestedTransactionsTest : TransactionsTestBase
1517 {
18+ private StorageProviderInfo storageProviderInfo ;
1619 public override void TestFixtureSetUp ( )
1720 {
1821 base . TestFixtureSetUp ( ) ;
1922 Domain . OpenSession ( ) ;
23+ storageProviderInfo = StorageProviderInfo . Instance ;
2024 }
2125
2226 public override void TestFixtureTearDown ( )
@@ -130,5 +134,106 @@ public void WrongNestedTransactionUsageTest()
130134 Assert . IsNull ( Session . Current . Transaction ) ;
131135 Assert . IsNull ( StorageTestHelper . GetNativeTransaction ( ) ) ;
132136 }
137+
138+ [ Test ]
139+ public void RollbackNestedTransactionWithActiveEnumeratorTest ( )
140+ {
141+ var session = Session . Demand ( ) ;
142+ using ( var outerTx = session . OpenTransaction ( ) ) {
143+ _ = new Hexagon ( ) ;
144+ _ = new Hexagon ( ) ;
145+ _ = new Hexagon ( ) ;
146+
147+ IEnumerator < int > enumerator = null ;
148+ var innerTx = session . OpenTransaction ( TransactionOpenMode . New ) ;
149+
150+ enumerator = session . Query . All < Hexagon > ( )
151+ . Select ( item => item . Id ) . AsEnumerable ( ) . GetEnumerator ( ) ;
152+ _ = enumerator . MoveNext ( ) ;
153+
154+ if ( storageProviderInfo . CheckProviderIs ( StorageProvider . SqlServer ) ) {
155+ _ = Assert . Throws < StorageException > ( ( ) => innerTx . Dispose ( ) ) ;
156+ }
157+ else {
158+ Assert . DoesNotThrow ( ( ) => innerTx . Dispose ( ) ) ;
159+ }
160+ }
161+ }
162+
163+ [ Test ]
164+ public void RollbackNestedTransactionWithActiveEnumeratorAndThenCompleteOutermostTest ( )
165+ {
166+ var session = Session . Demand ( ) ;
167+ using ( var outerTx = session . OpenTransaction ( ) ) {
168+ _ = new Hexagon ( ) ;
169+ _ = new Hexagon ( ) ;
170+ _ = new Hexagon ( ) ;
171+
172+ IEnumerator < int > enumerator = null ;
173+ var innerTx = session . OpenTransaction ( TransactionOpenMode . New ) ;
174+
175+ enumerator = session . Query . All < Hexagon > ( )
176+ . Select ( item => item . Id ) . AsEnumerable ( ) . GetEnumerator ( ) ;
177+ _ = enumerator . MoveNext ( ) ;
178+
179+ if ( storageProviderInfo . CheckProviderIs ( StorageProvider . SqlServer ) ) {
180+ _ = Assert . Throws < StorageException > ( ( ) => innerTx . Dispose ( ) ) ;
181+ }
182+ else {
183+ Assert . DoesNotThrow ( ( ) => innerTx . Dispose ( ) ) ;
184+ }
185+ outerTx . Complete ( ) ;
186+ }
187+ }
188+
189+ [ Test ]
190+ public void CommitNestedTransactionWithActiveEnumeratorAndRollbackOutermostTest ( )
191+ {
192+ var session = Session . Demand ( ) ;
193+ using ( var outerTx = session . OpenTransaction ( ) ) {
194+ _ = new Hexagon ( ) ;
195+ _ = new Hexagon ( ) ;
196+ _ = new Hexagon ( ) ;
197+
198+ IEnumerator < int > enumerator = null ;
199+ var innerTx = session . OpenTransaction ( TransactionOpenMode . New ) ;
200+
201+ enumerator = session . Query . All < Hexagon > ( )
202+ . Select ( item => item . Id ) . AsEnumerable ( ) . GetEnumerator ( ) ;
203+ _ = enumerator . MoveNext ( ) ;
204+
205+ innerTx . Complete ( ) ;
206+ innerTx . Dispose ( ) ;
207+ }
208+ }
209+
210+ [ Test ]
211+ public void CommitNestedTransactionWithActiveEnumeratorAndCommitOutermostTest ( )
212+ {
213+ var session = Session . Demand ( ) ;
214+ var outerTx = session . OpenTransaction ( ) ;
215+ _ = new Hexagon ( ) ;
216+ _ = new Hexagon ( ) ;
217+ _ = new Hexagon ( ) ;
218+
219+ IEnumerator < int > enumerator = null ;
220+ var innerTx = session . OpenTransaction ( TransactionOpenMode . New ) ;
221+
222+ enumerator = session . Query . All < Hexagon > ( )
223+ . Select ( item => item . Id ) . AsEnumerable ( ) . GetEnumerator ( ) ;
224+ _ = enumerator . MoveNext ( ) ;
225+
226+ innerTx . Complete ( ) ;
227+ innerTx . Dispose ( ) ;
228+
229+ outerTx . Complete ( ) ;
230+ if ( storageProviderInfo . CheckProviderIs ( StorageProvider . SqlServer ) ) {
231+ var exception = Assert . Throws < StorageException > ( ( ) => outerTx . Dispose ( ) ) ;
232+ Assert . That ( exception . InnerException , Is . InstanceOf < System . Data . SqlClient . SqlException > ( ) ) ;
233+ }
234+ else {
235+ Assert . DoesNotThrow ( ( ) => outerTx . Dispose ( ) ) ;
236+ }
237+ }
133238 }
134239}
0 commit comments