Ejemplo n.º 1
0
        private bool EnlistSessionIfHasTransactionActive(String key, SqlMapper sqlMap)
        {
            if (!_kernel.HasComponent(typeof(ITransactionManager)))
            {
                return(false);
            }

            bool enlisted = false;

            if (key == null)
            {
                key = "iBATIS.DataMapper";
            }

            ITransactionManager manager = (ITransactionManager)_kernel[typeof(ITransactionManager)];

            Transaction transaction = manager.CurrentTransaction;

            if (transaction != null)
            {
                if (!transaction.Context.Contains(key))
                {
                    transaction.Context[key] = true;
                    transaction.Enlist(new ResourceSqlMapAdapter(sqlMap.BeginTransaction(false)));
                    transaction.RegisterSynchronization(new SqlMapKeeper(sqlMap));
                    enlisted = true;
                }
            }

            _kernel.ReleaseComponent(manager);

            return(enlisted);
        }
        private bool EnlistSessionIfHasTransactionActive(String key, ISession session)
        {
            if (!_kernel.HasComponent(typeof(ITransactionManager)))
            {
                return(false);
            }

            bool enlisted = false;

            ITransactionManager manager = (ITransactionManager)_kernel[typeof(ITransactionManager)];

            Transaction transaction = manager.CurrentTransaction;

            if (transaction != null)
            {
                if (!transaction.Context.Contains(key))
                {
                    transaction.Context[key] = true;
                    transaction.Enlist(new ResourceSessionAdapter(session.BeginTransaction()));
                    transaction.RegisterSynchronization(new SessionKeeper(session, key));
                    enlisted = true;
                }
            }

            _kernel.ReleaseComponent(manager);

            return(enlisted);
        }
Ejemplo n.º 3
0
        public void NewTransactionBeforeUsingSession()
        {
            ISessionManager manager = (ISessionManager)
                                      container[typeof(ISessionManager)];

            ITransactionManager tmanager = (ITransactionManager)
                                           container[typeof(ITransactionManager)];

            ITransaction transaction = tmanager.CreateTransaction(
                TransactionMode.Requires, IsolationMode.Serializable);

            transaction.Begin();

            ISession session = manager.OpenSession();

            Assert.IsNotNull(session);
            Assert.IsNotNull(session.Transaction);

            transaction.Commit();

            Assert.IsTrue(session.Transaction.WasCommitted);
            Assert.IsTrue(session.IsConnected);

            session.Dispose();

            Assert.IsTrue((container[typeof(ISessionStore)]
                           as ISessionStore).IsCurrentActivityEmptyFor(Constants.DefaultAlias));
        }
Ejemplo n.º 4
0
        public ISession OpenSession(String alias)
        {
            if (alias == null)
            {
                throw new ArgumentNullException("alias");
            }

            ITransaction transaction = ObtainCurrentTransaction();

            bool weAreSessionOwner = false;

            SessionDelegate wrapped = sessionStore.FindCompatibleSession(alias);

            ISession session;

            if (wrapped == null)
            {
                session = CreateSession(alias); weAreSessionOwner = true;

                wrapped = WrapSession(transaction != null, session);

                sessionStore.Store(alias, wrapped);

                EnlistIfNecessary(weAreSessionOwner, transaction, wrapped);
            }
            else
            {
                EnlistIfNecessary(weAreSessionOwner, transaction, wrapped);
                wrapped = WrapSession(true, wrapped.InnerSession);
            }

            return(wrapped);
        }
Ejemplo n.º 5
0
        /// <summary>
        ///     Enlists if necessary.
        /// </summary>
        /// <param name="weAreSessionOwner">if set to <c>true</c> [we are session owner].</param>
        /// <param name="transaction">The transaction.</param>
        /// <param name="session">The session.</param>
        /// <returns></returns>
        protected bool EnlistIfNecessary(bool weAreSessionOwner,
                                         ITransaction transaction,
                                         StatelessSessionDelegate session)
        {
            if (transaction == null)
            {
                return(false);
            }

            var list = (IList <IStatelessSession>)transaction.Context["nh.statelessSession.enlisted"];

            bool shouldEnlist;

            if (list == null)
            {
                list = new List <IStatelessSession>();

                shouldEnlist = true;
            }
            else
            {
                shouldEnlist = true;

                foreach (var s in list)
                {
                    if (StatelessSessionDelegate.AreEqual(session, s))
                    {
                        shouldEnlist = false;
                        break;
                    }
                }
            }

            if (shouldEnlist)
            {
                if (session.Transaction == null || !session.Transaction.IsActive)
                {
                    transaction.Context["nh.statelessSession.enlisted"] = list;

                    var level = TranslateIsolationLevel(transaction.IsolationMode);
                    transaction.Enlist(new ResourceAdapter(session.BeginTransaction(level), transaction.IsAmbient));

                    list.Add(session);
                }

                if (weAreSessionOwner)
                {
                    transaction.RegisterSynchronization(new StatelessSessionDisposeSynchronization(session));
                }
            }

            return(true);
        }
Ejemplo n.º 6
0
        protected bool EnlistIfNecessary(bool weAreSessionOwner,
                                         ITransaction transaction,
                                         SessionDelegate session)
        {
            if (transaction == null)
            {
                return(false);
            }

            IList list = (IList)transaction.Context["nh.session.enlisted"];

            bool shouldEnlist;

            if (list == null)
            {
                list = new ArrayList();

                transaction.Context["nh.session.enlisted"] = list;

                shouldEnlist = true;
            }
            else
            {
                shouldEnlist = true;

                foreach (ISession sess in list)
                {
                    if (SessionDelegate.AreEqual(session, sess))
                    {
                        shouldEnlist = false;
                        break;
                    }
                }
            }

            if (shouldEnlist)
            {
                // TODO: propagate IsolationLevel, expose as transaction property

                transaction.Enlist(new ResourceAdapter(session.BeginTransaction()));

                list.Add(session);

                if (weAreSessionOwner)
                {
                    transaction.RegisterSynchronization(
                        new SessionDisposeSynchronization(session));
                }
            }

            return(true);
        }
Ejemplo n.º 7
0
		/// <summary>
		/// Enlists if necessary.
		/// </summary>
		/// <param name="weAreSessionOwner">if set to <c>true</c> [we are session owner].</param>
		/// <param name="transaction">The transaction.</param>
		/// <param name="session">The session.</param>
		/// <returns></returns>
		protected bool EnlistIfNecessary(bool weAreSessionOwner, 
		                                 ITransaction transaction, 
		                                 SessionDelegate session)
		{
			if (transaction == null) return false;

			IList list = (IList) transaction.Context["nh.session.enlisted"];

			bool shouldEnlist;

			if (list == null)
			{
				list = new ArrayList();

				shouldEnlist = true;
			}
			else
			{
				shouldEnlist = true;

				foreach(ISession sess in list)
				{
					if (SessionDelegate.AreEqual(session, sess))
					{
						shouldEnlist = false;
						break;
					}
				}
			}

			if (shouldEnlist)
			{
				if (!transaction.DistributedTransaction)
				{
					transaction.Context["nh.session.enlisted"] = list;

					IsolationLevel level = TranslateIsolationLevel(transaction.IsolationMode);
					transaction.Enlist(new ResourceAdapter(session.BeginTransaction(level)));

					list.Add(session);
				}

				if (weAreSessionOwner)
				{
					transaction.RegisterSynchronization(new SessionDisposeSynchronization(session));
				}
			}

			return true;
		}