Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / ndp / fx / src / DataOracleClient / System / Data / OracleClient / OracleTransaction.cs / 2 / OracleTransaction.cs
//------------------------------------------------------------------------------ //// Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //----------------------------------------------------------------------------- namespace System.Data.OracleClient { using System; using System.Data; using System.Data.Common; using System.Runtime.InteropServices; using System.Diagnostics; //--------------------------------------------------------------------- // OracleTransaction // // Implements the Oracle Transaction object, which handles local // transaction requests // sealed public class OracleTransaction : DbTransaction { private OracleConnection _connection; private int _connectionCloseCount; // The close count of the connection; used to decide if we're zombied private IsolationLevel _isolationLevel = IsolationLevel.ReadCommitted; private static int _objectTypeCount; // Bid counter internal readonly int _objectID = System.Threading.Interlocked.Increment(ref _objectTypeCount); internal OracleTransaction(OracleConnection connection) : this (connection, IsolationLevel.Unspecified) {} internal OracleTransaction( OracleConnection connection, IsolationLevel isolationLevel ) { OracleConnection.VerifyExecutePermission(); //------------------------------------------------------------------------------------- // pre-condition validation // ensure we are not attempting to nest transactions. Enforced at runtime by // OracleInternalConnection.BeginOracleTransaction Debug.Assert ( connection.TransactionState == TransactionState.AutoCommit ); // SQLHOTFIX# 50003423: setting isolation levels may require that we execute commands on // the server which will, in turn, rollback any potentially dead transactions and reset // our state to auto-commit mode. This typically happens when a connection is re-used // to execute a new command after a previous command associated with a transaction // has been committed. When we're attempting to begin a new transaction, we need to // ensure that we've cleared the internal state *before* partially initializing members. Debug.Assert ( connection.Transaction == null ); //-------------------------------------------------------------------------------------- TransactionState previousState = connection.TransactionState; if (TransactionState.GlobalStarted == previousState) { throw ADP.NoLocalTransactionInDistributedContext(); } _connection = connection; _connectionCloseCount = connection.CloseCount; _isolationLevel = isolationLevel; // SQLBUVSTS 39106: set the transaction state before changing the isolation level _connection.TransactionState = TransactionState.LocalStarted; try { // Tell oracle what the isolation level should be. switch (isolationLevel) { case IsolationLevel.Unspecified: // Take whatever we get from the server break; case IsolationLevel.ReadCommitted: { // DEVNOTE: Most often, this is the default, but it is configurable on the server; // we should avoid the roundtrip if we can figure out whether this is really // the default. using (OracleCommand cmd = Connection.CreateCommand()) { cmd.CommandText = "set transaction isolation level read committed"; cmd.ExecuteNonQuery(); } } break; case IsolationLevel.Serializable: { using (OracleCommand cmd = Connection.CreateCommand()) { cmd.CommandText = "set transaction isolation level serializable"; cmd.ExecuteNonQuery(); } } break; default: throw ADP.UnsupportedIsolationLevel(); } } catch { // in case of error, revert the transaction state and rethrow _connection.TransactionState = previousState; throw; } // SQLBUDT# 449125 and SQLHOTFIX# 50003423 - ensure that connection's TransactionState has not been reset // during initialization of the transaction object. Debug.Assert(_connection.TransactionState == TransactionState.LocalStarted, "Executing commands to set isolational level has reset the connection's transaction state."); } new public OracleConnection Connection { get { return _connection; } } override protected DbConnection DbConnection { get { return Connection; } } override public IsolationLevel IsolationLevel { get { AssertNotCompleted(); if (IsolationLevel.Unspecified == _isolationLevel) { using (OracleCommand cmd = Connection.CreateCommand()) { cmd.Transaction = this; cmd.CommandText = "select decode(value,'FALSE',0,1) from V$SYSTEM_PARAMETER where name = 'serializable'"; Decimal x = (Decimal)cmd.ExecuteScalar(); if (0 == x) _isolationLevel = IsolationLevel.ReadCommitted; else _isolationLevel = IsolationLevel.Serializable; } } return _isolationLevel; } } internal int ObjectID { get { return _objectID; } } private void AssertNotCompleted() { if (null == Connection || _connectionCloseCount != Connection.CloseCount) { throw ADP.TransactionCompleted(); } } override public void Commit() { OracleConnection.ExecutePermission.Demand(); IntPtr hscp; Bid.ScopeEnter(out hscp, "%d#\n", ObjectID); try { AssertNotCompleted(); Connection.Commit(); Dispose(true); } finally { Bid.ScopeLeave(ref hscp); } } protected override void Dispose(bool disposing) { if (disposing) { if ( null != Connection ) { Connection.Rollback(); } _connection = null; } base.Dispose(disposing); } override public void Rollback() { IntPtr hscp; Bid.ScopeEnter(out hscp, " %d#\n", ObjectID); try { AssertNotCompleted(); Dispose(true); } finally { Bid.ScopeLeave(ref hscp); } } }; } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //------------------------------------------------------------------------------ // // Copyright (c) Microsoft Corporation. All rights reserved. // //[....] //----------------------------------------------------------------------------- namespace System.Data.OracleClient { using System; using System.Data; using System.Data.Common; using System.Runtime.InteropServices; using System.Diagnostics; //--------------------------------------------------------------------- // OracleTransaction // // Implements the Oracle Transaction object, which handles local // transaction requests // sealed public class OracleTransaction : DbTransaction { private OracleConnection _connection; private int _connectionCloseCount; // The close count of the connection; used to decide if we're zombied private IsolationLevel _isolationLevel = IsolationLevel.ReadCommitted; private static int _objectTypeCount; // Bid counter internal readonly int _objectID = System.Threading.Interlocked.Increment(ref _objectTypeCount); internal OracleTransaction(OracleConnection connection) : this (connection, IsolationLevel.Unspecified) {} internal OracleTransaction( OracleConnection connection, IsolationLevel isolationLevel ) { OracleConnection.VerifyExecutePermission(); //------------------------------------------------------------------------------------- // pre-condition validation // ensure we are not attempting to nest transactions. Enforced at runtime by // OracleInternalConnection.BeginOracleTransaction Debug.Assert ( connection.TransactionState == TransactionState.AutoCommit ); // SQLHOTFIX# 50003423: setting isolation levels may require that we execute commands on // the server which will, in turn, rollback any potentially dead transactions and reset // our state to auto-commit mode. This typically happens when a connection is re-used // to execute a new command after a previous command associated with a transaction // has been committed. When we're attempting to begin a new transaction, we need to // ensure that we've cleared the internal state *before* partially initializing members. Debug.Assert ( connection.Transaction == null ); //-------------------------------------------------------------------------------------- TransactionState previousState = connection.TransactionState; if (TransactionState.GlobalStarted == previousState) { throw ADP.NoLocalTransactionInDistributedContext(); } _connection = connection; _connectionCloseCount = connection.CloseCount; _isolationLevel = isolationLevel; // SQLBUVSTS 39106: set the transaction state before changing the isolation level _connection.TransactionState = TransactionState.LocalStarted; try { // Tell oracle what the isolation level should be. switch (isolationLevel) { case IsolationLevel.Unspecified: // Take whatever we get from the server break; case IsolationLevel.ReadCommitted: { // DEVNOTE: Most often, this is the default, but it is configurable on the server; // we should avoid the roundtrip if we can figure out whether this is really // the default. using (OracleCommand cmd = Connection.CreateCommand()) { cmd.CommandText = "set transaction isolation level read committed"; cmd.ExecuteNonQuery(); } } break; case IsolationLevel.Serializable: { using (OracleCommand cmd = Connection.CreateCommand()) { cmd.CommandText = "set transaction isolation level serializable"; cmd.ExecuteNonQuery(); } } break; default: throw ADP.UnsupportedIsolationLevel(); } } catch { // in case of error, revert the transaction state and rethrow _connection.TransactionState = previousState; throw; } // SQLBUDT# 449125 and SQLHOTFIX# 50003423 - ensure that connection's TransactionState has not been reset // during initialization of the transaction object. Debug.Assert(_connection.TransactionState == TransactionState.LocalStarted, "Executing commands to set isolational level has reset the connection's transaction state."); } new public OracleConnection Connection { get { return _connection; } } override protected DbConnection DbConnection { get { return Connection; } } override public IsolationLevel IsolationLevel { get { AssertNotCompleted(); if (IsolationLevel.Unspecified == _isolationLevel) { using (OracleCommand cmd = Connection.CreateCommand()) { cmd.Transaction = this; cmd.CommandText = "select decode(value,'FALSE',0,1) from V$SYSTEM_PARAMETER where name = 'serializable'"; Decimal x = (Decimal)cmd.ExecuteScalar(); if (0 == x) _isolationLevel = IsolationLevel.ReadCommitted; else _isolationLevel = IsolationLevel.Serializable; } } return _isolationLevel; } } internal int ObjectID { get { return _objectID; } } private void AssertNotCompleted() { if (null == Connection || _connectionCloseCount != Connection.CloseCount) { throw ADP.TransactionCompleted(); } } override public void Commit() { OracleConnection.ExecutePermission.Demand(); IntPtr hscp; Bid.ScopeEnter(out hscp, "%d#\n", ObjectID); try { AssertNotCompleted(); Connection.Commit(); Dispose(true); } finally { Bid.ScopeLeave(ref hscp); } } protected override void Dispose(bool disposing) { if (disposing) { if ( null != Connection ) { Connection.Rollback(); } _connection = null; } base.Dispose(disposing); } override public void Rollback() { IntPtr hscp; Bid.ScopeEnter(out hscp, " %d#\n", ObjectID); try { AssertNotCompleted(); Dispose(true); } finally { Bid.ScopeLeave(ref hscp); } } }; } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- XPathQilFactory.cs
- PathGeometry.cs
- RectangleHotSpot.cs
- XmlConvert.cs
- Region.cs
- SharedPerformanceCounter.cs
- DefaultTraceListener.cs
- XmlUrlResolver.cs
- DesignerView.xaml.cs
- OSFeature.cs
- ReaderContextStackData.cs
- Propagator.JoinPropagator.SubstitutingCloneVisitor.cs
- SQLDateTime.cs
- ResourceProviderFactory.cs
- COM2ExtendedUITypeEditor.cs
- TextAnchor.cs
- XNodeValidator.cs
- WorkflowPrinting.cs
- SHA256Managed.cs
- ReplyAdapterChannelListener.cs
- TrackBar.cs
- TextWriter.cs
- CodeCatchClause.cs
- XslException.cs
- RepeaterItem.cs
- EntityDataSourceView.cs
- PeerCollaborationPermission.cs
- unitconverter.cs
- CheckBox.cs
- Point.cs
- PreProcessInputEventArgs.cs
- WriteFileContext.cs
- RegisteredDisposeScript.cs
- ObjectHandle.cs
- SqlParameter.cs
- SqlTriggerContext.cs
- BooleanToVisibilityConverter.cs
- PersonalizationStateInfoCollection.cs
- TypeDelegator.cs
- WinEventQueueItem.cs
- ResourceDescriptionAttribute.cs
- DataBinding.cs
- SocketInformation.cs
- RequestCacheValidator.cs
- XhtmlBasicObjectListAdapter.cs
- PasswordRecoveryDesigner.cs
- ObjectReferenceStack.cs
- AxisAngleRotation3D.cs
- ServiceContractListItem.cs
- DataErrorValidationRule.cs
- TextAnchor.cs
- OperatingSystemVersionCheck.cs
- PeerCredential.cs
- MultitargetUtil.cs
- ColorAnimationUsingKeyFrames.cs
- DataMisalignedException.cs
- Int64AnimationBase.cs
- HashRepartitionEnumerator.cs
- CalendarAutoFormat.cs
- NameValueCollection.cs
- NumericPagerField.cs
- RawStylusInputCustomData.cs
- SystemIPGlobalStatistics.cs
- Publisher.cs
- ColorTranslator.cs
- SplitterCancelEvent.cs
- CodeAttributeDeclaration.cs
- RecordsAffectedEventArgs.cs
- ReverseQueryOperator.cs
- CompositeFontFamily.cs
- DoubleKeyFrameCollection.cs
- MsmqIntegrationBindingCollectionElement.cs
- SingleAnimationBase.cs
- ValidationEventArgs.cs
- RealProxy.cs
- CacheEntry.cs
- IndentTextWriter.cs
- CalendarAutoFormat.cs
- SimpleModelProvider.cs
- DBDataPermissionAttribute.cs
- BooleanAnimationUsingKeyFrames.cs
- AttachedPropertyBrowsableWhenAttributePresentAttribute.cs
- DocumentAutomationPeer.cs
- SqlGatherConsumedAliases.cs
- TextMarkerSource.cs
- XmlSchemaDocumentation.cs
- TemplateBamlRecordReader.cs
- DesignRelation.cs
- CompressionTransform.cs
- MessageLogger.cs
- DocumentApplicationJournalEntryEventArgs.cs
- TemplateXamlTreeBuilder.cs
- WebPartChrome.cs
- GeneratedView.cs
- XmlIncludeAttribute.cs
- BamlResourceSerializer.cs
- CachingHintValidation.cs
- IgnoreDataMemberAttribute.cs
- FragmentQueryKB.cs
- DirectoryInfo.cs