如何在处理SqlTransaction之前检查状态

LCJ*_*LCJ 4 .net c# ado.net

我有以下使用SqlTransaction的代码.我已经在catch中调用dispose并最终阻止了..但是在调用Dispose()之前我还没有检查它是否已经被释放.在调用Dispose()之前,我们如何检查SqlTransaction是否已被释放?

我已经引用了MSDN:SqlTransaction.Dispose方法.但这并不包括我的问题.

另请参阅http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqltransaction.dispose(v=vs.100).aspx

注意:我已经知道它TransactionScope有优势了SqlTransaction.但我试图了解SqlTransaction的配置.

 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();
                }
            }
Run Code Online (Sandbox Code Playgroud)

Hab*_*bib 8

在调用Dispose()之前,我们如何检查SqlTransaction是否已被释放?

你不必.两次调用处置不会对您造成任何问题.

配置 - MSDN

如果多次调用对象的Dispose方法,则该对象必须忽略第一个之后的所有调用.如果多次调用Dispose方法,则该对象不得抛出异常.除了Dispose之外的实例方法可以在已经处置资源时抛出ObjectDisposedException.

但是,如果您只想调用Dispose一次,那么您可以使用布尔标志来设置事务处理时间,也可以将其设置为null.或者在catch块中删除对dispose的调用,因为finally将始终调用块.

由于SqlTransaction实现了IDisposable,如果将它与using block一起使用它会更好.就像是:

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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

由于使用块的作用类似于try/finally块,因此它将确保在事务完成时处理事务(即使发生异常).所以你不必手动打电话Dispose.