public void ParticipatingTransactionWithRollbackOnly() { IDbProvider dbProvider = (IDbProvider) mocks.CreateMock(typeof (IDbProvider)); IDbConnection connection = (IDbConnection) mocks.CreateMock(typeof (IDbConnection)); IDbTransaction transaction = (IDbTransaction) mocks.CreateMock(typeof (IDbTransaction)); using (mocks.Ordered()) { Expect.Call(dbProvider.CreateConnection()).Return(connection); connection.Open(); LastCall.On(connection).Repeat.Once(); Expect.Call(connection.BeginTransaction(_defaultIsolationLevel)).Return(transaction); //standard tx timeout. transaction.Rollback(); LastCall.On(transaction).Repeat.Once(); connection.Dispose(); } mocks.ReplayAll(); AdoPlatformTransactionManager tm = new AdoPlatformTransactionManager(dbProvider); tm.TransactionSynchronization = TransactionSynchronizationState.Always; Assert.IsFalse(TransactionSynchronizationManager.HasResource(dbProvider), "Hasn't thread db provider"); Assert.IsFalse(TransactionSynchronizationManager.SynchronizationActive, "Synchronizations not active"); ITransactionStatus ts = tm.GetTransaction(new DefaultTransactionDefinition()); TestTransactionSynchronization synch = new TestTransactionSynchronization(dbProvider, TransactionSynchronizationStatus.Rolledback); TransactionSynchronizationManager.RegisterSynchronization(synch); bool outerTransactionBoundaryReached = false; try { Assert.IsTrue(ts.IsNewTransaction); TransactionTemplate tt = new TransactionTemplate(tm); TransactionTemplate tt2 = new TransactionTemplate(tm); tt.Execute(new ParticipatingTxWithRollbackOnlyTxCallback(tt2, dbProvider)); outerTransactionBoundaryReached = true; tm.Commit(ts); Assert.Fail("Should have thrown UnexpectedRollbackException"); } catch (UnexpectedRollbackException) { // expected if (!outerTransactionBoundaryReached) { tm.Rollback(ts); } Assert.IsTrue(outerTransactionBoundaryReached); } Assert.IsFalse(TransactionSynchronizationManager.HasResource(dbProvider), "Hasn't thread db provider"); Assert.IsFalse(synch.beforeCommitCalled); Assert.IsTrue(synch.beforeCompletionCalled); Assert.IsFalse(synch.afterCommitCalled); Assert.IsTrue(synch.afterCompletionCalled); mocks.VerifyAll(); }
/// <summary> /// TBD /// </summary> public static IPlatformTransaction CreateTransaction(IDbProvider dbProvider, ITransactionDefinition txDefinition) { AdoPlatformTransactionManager txMgr = new AdoPlatformTransactionManager(dbProvider); ITransactionStatus txStatus = txMgr.GetTransaction(txDefinition); return new PlatformTransactionHolder(txStatus, txMgr); }