private static void WriteTransactionHeader(TdsPackageWriter writer, TdsEnums.TransactionManagerRequestType request, long sqlTransactionId) { writer.NewPackage(TdsEnums.MT_TRANS); writer.WriteMarsHeader(sqlTransactionId); writer.WriteInt16((short)request); // write TransactionManager Request type }
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); } } }