OracleTransaction.cs source code in C# .NET

Source code for the .NET framework in C#

                        

Code:

/ Net / Net / 3.5.50727.3053 / DEVDIV / depot / DevDiv / releases / whidbey / netfxsp / 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;
 
    //---------------------------------------------------------------------
    // 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();
 
            TransactionState previousState = connection.TransactionState; 

            if (TransactionState.GlobalStarted == previousState) { 
                throw ADP.NoLocalTransactionInDistributedContext();
            }

            _connection             = connection; 
            _connectionCloseCount   = connection.CloseCount;
            _isolationLevel         = isolationLevel; 
 
            // VSTS 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; 
            }
        }

 
        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;
 
    //---------------------------------------------------------------------
    // 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();
 
            TransactionState previousState = connection.TransactionState; 

            if (TransactionState.GlobalStarted == previousState) { 
                throw ADP.NoLocalTransactionInDistributedContext();
            }

            _connection             = connection; 
            _connectionCloseCount   = connection.CloseCount;
            _isolationLevel         = isolationLevel; 
 
            // VSTS 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; 
            }
        }

 
        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

Network programming in C#, Network Programming in VB.NET, Network Programming in .NET
This book is available now!
Buy at Amazon US or
Buy at Amazon UK