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); } } }
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(); }
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); } } }
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; } }
internal void ExecuteTransaction(SqlInternalConnection.TransactionRequest transactionRequest, string name, System.Data.IsolationLevel iso) { this.ExecuteTransaction(transactionRequest, name, iso, null, false); }