How to check state before uninstalling SqlTransaction

I have the following code that uses SqlTransaction. I called dispose in catch and finally blocks. But I did not check if it was already configured before calling Dispose (). How can we check if SqlTransaction is already set before calling Dispose ()?

I referenced the MSDN: SqlTransaction.Dispose method . But this does not concern my question.

Also mentioned is http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction.dispose(v=vs.100).aspx

Note. I already know that it TransactionScopehas advantages over SqlTransaction. But I'm trying to understand how SqlTransactions are arranged.

CODE

 using (SqlConnection connection = new SqlConnection(connectionString))
        {
            connection.Open();

            SqlTransaction transaction = null;

            try
            {
                transaction = connection.BeginTransaction();

                sessionID = GetSessionIDForAssociate(connection, empID, transaction);
                //Other code

                //Commit
                transaction.Commit();
            }
            catch
            {
                //Rollback
                if (transaction != null)
                {
                    transaction.Rollback();
                    transaction.Dispose();
                }

                //Throw exception
                throw;
            }
            finally
            {
                if (transaction != null)
                {
                    transaction.Dispose();
                }
            }
+4
source share
4 answers

, SqlTransaction Dispose()?

. .

Dispose - MSDN

Dispose method , . , Dispose . , Dispose, ObjectDisposedException, .

Dispose , , null. catch, finally.

SqlTransaction IDisposable, , , . - :

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();

    using (SqlTransaction transaction = connection.BeginTransaction())
    {
        try
        {
            sessionID = GetSessionIDForAssociate(connection, empID, transaction);
            //Other code

            //Commit
            transaction.Commit();
        }
        catch
        {
            //Rollback
            if (transaction != null)
            {
                transaction.Rollback();
            }

            //Throw exception
            throw;
        }
    }
}

try/finally, ( ). Dispose.

+7

transaction=null , .

+2

, ? Dispose , catch:

using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();

    SqlTransaction transaction = null;

    try
    {
        transaction = connection.BeginTransaction();

        sessionID = GetSessionIDForAssociate(connection, empID, transaction);
        //Other code

        //Commit
        transaction.Commit();
    }
    catch
    {
        //Rollback
        if (transaction != null)
        {
            // No need to dispose here - finally is always called
            transaction.Rollback();
        }

        //Throw exception
        throw;
    }
    finally
    {
        if (transaction != null)
        {
            // Always called, so no need to dispose elsewhere.
            transaction.Dispose();
        }
    }
+2

.Dispose() catch. , , .

It does not answer β€œhow can I know if it has already been configured”, but it probably solves your problem.

+2
source

All Articles