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
- ExtensionQuery.cs
- WindowAutomationPeer.cs
- HttpHandlerActionCollection.cs
- InvalidOperationException.cs
- Stroke.cs
- SimpleBitVector32.cs
- EntityTypeEmitter.cs
- AccessedThroughPropertyAttribute.cs
- CFStream.cs
- FloatMinMaxAggregationOperator.cs
- ControlUtil.cs
- WindowsTokenRoleProvider.cs
- Pkcs9Attribute.cs
- CompositeCollection.cs
- WebEvents.cs
- RenameRuleObjectDialog.cs
- SubstitutionResponseElement.cs
- RelationshipEntry.cs
- DiscardableAttribute.cs
- ForeignKeyConstraint.cs
- IndividualDeviceConfig.cs
- QilName.cs
- MouseGestureConverter.cs
- RouteItem.cs
- OdbcConnectionStringbuilder.cs
- JsonObjectDataContract.cs
- OperationAbortedException.cs
- SatelliteContractVersionAttribute.cs
- DataGridViewImageColumn.cs
- MachineSettingsSection.cs
- DeflateEmulationStream.cs
- AuthenticationManager.cs
- ComponentEvent.cs
- SendActivityValidator.cs
- IInstanceContextProvider.cs
- XamlSerializer.cs
- CustomCategoryAttribute.cs
- VersionedStreamOwner.cs
- DoubleConverter.cs
- loginstatus.cs
- LinqMaximalSubtreeNominator.cs
- MetadataSection.cs
- MailAddressCollection.cs
- WorkflowMarkupSerializationManager.cs
- EntityDataSourceReferenceGroup.cs
- MimeTypePropertyAttribute.cs
- ButtonBaseAutomationPeer.cs
- SqlExpander.cs
- PerfCounters.cs
- IncrementalCompileAnalyzer.cs
- GridViewRowEventArgs.cs
- AbstractExpressions.cs
- ParseHttpDate.cs
- UriScheme.cs
- TableRowCollection.cs
- WebPartEditorOkVerb.cs
- QueryContext.cs
- Events.cs
- ToolStripContainerDesigner.cs
- FontWeights.cs
- ToolTip.cs
- ThreadAttributes.cs
- ObjectTypeMapping.cs
- IProducerConsumerCollection.cs
- CodeSubDirectoriesCollection.cs
- GestureRecognizer.cs
- Attributes.cs
- RuleSettings.cs
- MemoryPressure.cs
- HtmlMeta.cs
- hwndwrapper.cs
- WebBrowserSiteBase.cs
- DataObjectAttribute.cs
- FontConverter.cs
- TemplateFactory.cs
- SqlDataAdapter.cs
- XmlAnyAttributeAttribute.cs
- MediaTimeline.cs
- EntityKey.cs
- DbUpdateCommandTree.cs
- ErrorFormatter.cs
- UnsafeMethods.cs
- BaseComponentEditor.cs
- SafeUserTokenHandle.cs
- CodeDefaultValueExpression.cs
- PersonalizationState.cs
- _NestedSingleAsyncResult.cs
- XsdValidatingReader.cs
- RangeValuePattern.cs
- DuplexClientBase.cs
- TiffBitmapEncoder.cs
- HatchBrush.cs
- XmlValueConverter.cs
- ParameterInfo.cs
- PartManifestEntry.cs
- FileInfo.cs
- StyleTypedPropertyAttribute.cs
- DynamicMethod.cs
- XmlProcessingInstruction.cs
- CharKeyFrameCollection.cs