Пример #1
0
 internal override void ExecuteTransaction(SqlInternalConnection.TransactionRequest transactionRequest, string name, System.Data.IsolationLevel iso, SqlInternalTransaction internalTransaction, bool isDelegateControlRequest)
 {
     if (base.IsConnectionDoomed)
     {
         if ((transactionRequest != SqlInternalConnection.TransactionRequest.Rollback) && (transactionRequest != SqlInternalConnection.TransactionRequest.IfRollback))
         {
             throw SQL.ConnectionDoomed();
         }
     }
     else
     {
         if ((((transactionRequest == SqlInternalConnection.TransactionRequest.Commit) || (transactionRequest == SqlInternalConnection.TransactionRequest.Rollback)) || (transactionRequest == SqlInternalConnection.TransactionRequest.IfRollback)) && (!this.Parser.MARSOn && this.Parser._physicalStateObj.BcpLock))
         {
             throw SQL.ConnectionLockedForBcpEvent();
         }
         string transactionName = (name == null) ? string.Empty : name;
         if (!this._parser.IsYukonOrNewer)
         {
             this.ExecuteTransactionPreYukon(transactionRequest, transactionName, iso, internalTransaction);
         }
         else
         {
             this.ExecuteTransactionYukon(transactionRequest, transactionName, iso, internalTransaction, isDelegateControlRequest);
         }
     }
 }
Пример #2
0
        internal override void ExecuteTransaction(SqlInternalConnection.TransactionRequest transactionRequest, string transactionName, System.Data.IsolationLevel iso, SqlInternalTransaction internalTransaction, bool isDelegateControlRequest)
        {
            if (Bid.AdvancedOn)
            {
                Bid.Trace("<sc.SqlInternalConnectionSmi.ExecuteTransaction|ADV> %d#, transactionRequest=%ls, transactionName='%ls', isolationLevel=%ls, internalTransaction=#%d transactionId=0x%I64x.\n", base.ObjectID, transactionRequest.ToString(), (transactionName != null) ? transactionName : "null", iso.ToString(), (internalTransaction != null) ? internalTransaction.ObjectID : 0, (internalTransaction != null) ? internalTransaction.TransactionId : 0L);
            }
            switch (transactionRequest)
            {
            case SqlInternalConnection.TransactionRequest.Begin:
                try
                {
                    this._pendingTransaction = internalTransaction;
                    this._smiConnection.BeginTransaction(transactionName, iso, this._smiEventSink);
                    goto Label_0121;
                }
                finally
                {
                    this._pendingTransaction = null;
                }
                break;

            case SqlInternalConnection.TransactionRequest.Promote:
                base.PromotedDTCToken = this._smiConnection.PromoteTransaction(this._currentTransaction.TransactionId, this._smiEventSink);
                goto Label_0121;

            case SqlInternalConnection.TransactionRequest.Commit:
                break;

            case SqlInternalConnection.TransactionRequest.Rollback:
            case SqlInternalConnection.TransactionRequest.IfRollback:
                this._smiConnection.RollbackTransaction(this._currentTransaction.TransactionId, transactionName, this._smiEventSink);
                goto Label_0121;

            case SqlInternalConnection.TransactionRequest.Save:
                this._smiConnection.CreateTransactionSavePoint(this._currentTransaction.TransactionId, transactionName, this._smiEventSink);
                goto Label_0121;

            default:
                goto Label_0121;
            }
            this._smiConnection.CommitTransaction(this._currentTransaction.TransactionId, this._smiEventSink);
Label_0121:
            this._smiEventSink.ProcessMessagesAndThrow();
        }
Пример #3
0
        internal void ExecuteTransactionYukon(SqlInternalConnection.TransactionRequest transactionRequest, string transactionName, System.Data.IsolationLevel iso, SqlInternalTransaction internalTransaction, bool isDelegateControlRequest)
        {
            TdsEnums.TransactionManagerRequestType    begin         = TdsEnums.TransactionManagerRequestType.Begin;
            TdsEnums.TransactionManagerIsolationLevel readCommitted = TdsEnums.TransactionManagerIsolationLevel.ReadCommitted;
            switch (iso)
            {
            case System.Data.IsolationLevel.Unspecified:
                readCommitted = TdsEnums.TransactionManagerIsolationLevel.Unspecified;
                break;

            case System.Data.IsolationLevel.Chaos:
                throw SQL.NotSupportedIsolationLevel(iso);

            case System.Data.IsolationLevel.ReadUncommitted:
                readCommitted = TdsEnums.TransactionManagerIsolationLevel.ReadUncommitted;
                break;

            case System.Data.IsolationLevel.Serializable:
                readCommitted = TdsEnums.TransactionManagerIsolationLevel.Serializable;
                break;

            case System.Data.IsolationLevel.Snapshot:
                readCommitted = TdsEnums.TransactionManagerIsolationLevel.Snapshot;
                break;

            case System.Data.IsolationLevel.ReadCommitted:
                readCommitted = TdsEnums.TransactionManagerIsolationLevel.ReadCommitted;
                break;

            case System.Data.IsolationLevel.RepeatableRead:
                readCommitted = TdsEnums.TransactionManagerIsolationLevel.RepeatableRead;
                break;

            default:
                throw ADP.InvalidIsolationLevel(iso);
            }
            TdsParserStateObject session = this._parser._physicalStateObj;
            TdsParser            parser  = this._parser;
            bool flag      = false;
            bool lockTaken = false;

            try
            {
                switch (transactionRequest)
                {
                case SqlInternalConnection.TransactionRequest.Begin:
                    begin = TdsEnums.TransactionManagerRequestType.Begin;
                    break;

                case SqlInternalConnection.TransactionRequest.Promote:
                    begin = TdsEnums.TransactionManagerRequestType.Promote;
                    break;

                case SqlInternalConnection.TransactionRequest.Commit:
                    begin = TdsEnums.TransactionManagerRequestType.Commit;
                    break;

                case SqlInternalConnection.TransactionRequest.Rollback:
                case SqlInternalConnection.TransactionRequest.IfRollback:
                    begin = TdsEnums.TransactionManagerRequestType.Rollback;
                    break;

                case SqlInternalConnection.TransactionRequest.Save:
                    begin = TdsEnums.TransactionManagerRequestType.Save;
                    break;
                }
                if ((internalTransaction != null) && internalTransaction.IsDelegated)
                {
                    if (!this._parser.MARSOn)
                    {
                        if (internalTransaction.OpenResultsCount != 0)
                        {
                            throw SQL.CannotCompleteDelegatedTransactionWithOpenResults();
                        }
                        Monitor.Enter(session, ref lockTaken);
                        if (internalTransaction.OpenResultsCount != 0)
                        {
                            throw SQL.CannotCompleteDelegatedTransactionWithOpenResults();
                        }
                    }
                    else
                    {
                        session = this._parser.GetSession(this);
                        flag    = true;
                    }
                }
                this._parser.TdsExecuteTransactionManagerRequest(null, begin, transactionName, readCommitted, base.ConnectionOptions.ConnectTimeout, internalTransaction, session, isDelegateControlRequest);
            }
            finally
            {
                if (flag)
                {
                    parser.PutSession(session);
                }
                if (lockTaken)
                {
                    Monitor.Exit(session);
                }
            }
        }
Пример #4
0
        internal void ExecuteTransactionPreYukon(SqlInternalConnection.TransactionRequest transactionRequest, string transactionName, System.Data.IsolationLevel iso, SqlInternalTransaction internalTransaction)
        {
            StringBuilder builder = new StringBuilder();

            switch (iso)
            {
            case System.Data.IsolationLevel.Unspecified:
                break;

            case System.Data.IsolationLevel.Chaos:
                throw SQL.NotSupportedIsolationLevel(iso);

            case System.Data.IsolationLevel.ReadUncommitted:
                builder.Append("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED");
                builder.Append(";");
                break;

            case System.Data.IsolationLevel.Serializable:
                builder.Append("SET TRANSACTION ISOLATION LEVEL SERIALIZABLE");
                builder.Append(";");
                break;

            case System.Data.IsolationLevel.Snapshot:
                throw SQL.SnapshotNotSupported(System.Data.IsolationLevel.Snapshot);

            case System.Data.IsolationLevel.ReadCommitted:
                builder.Append("SET TRANSACTION ISOLATION LEVEL READ COMMITTED");
                builder.Append(";");
                break;

            case System.Data.IsolationLevel.RepeatableRead:
                builder.Append("SET TRANSACTION ISOLATION LEVEL REPEATABLE READ");
                builder.Append(";");
                break;

            default:
                throw ADP.InvalidIsolationLevel(iso);
            }
            if (!ADP.IsEmpty(transactionName))
            {
                transactionName = " " + SqlConnection.FixupDatabaseTransactionName(transactionName);
            }
            switch (transactionRequest)
            {
            case SqlInternalConnection.TransactionRequest.Begin:
                builder.Append("BEGIN TRANSACTION");
                builder.Append(transactionName);
                break;

            case SqlInternalConnection.TransactionRequest.Commit:
                builder.Append("COMMIT TRANSACTION");
                builder.Append(transactionName);
                break;

            case SqlInternalConnection.TransactionRequest.Rollback:
                builder.Append("ROLLBACK TRANSACTION");
                builder.Append(transactionName);
                break;

            case SqlInternalConnection.TransactionRequest.IfRollback:
                builder.Append("IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION");
                builder.Append(transactionName);
                break;

            case SqlInternalConnection.TransactionRequest.Save:
                builder.Append("SAVE TRANSACTION");
                builder.Append(transactionName);
                break;
            }
            this._parser.TdsExecuteSQLBatch(builder.ToString(), base.ConnectionOptions.ConnectTimeout, null, this._parser._physicalStateObj);
            this._parser.Run(RunBehavior.UntilDone, null, null, null, this._parser._physicalStateObj);
            if (transactionRequest == SqlInternalConnection.TransactionRequest.Begin)
            {
                this._parser.CurrentTransaction = internalTransaction;
            }
        }
Пример #5
0
 internal void ExecuteTransaction(SqlInternalConnection.TransactionRequest transactionRequest, string name, System.Data.IsolationLevel iso)
 {
     this.ExecuteTransaction(transactionRequest, name, iso, null, false);
 }