久久久久久久av_日韩在线中文_看一级毛片视频_日本精品二区_成人深夜福利视频_武道仙尊动漫在线观看

SqlTransaction 是否需要調用 Dispose?

Does SqlTransaction need to have Dispose called?(SqlTransaction 是否需要調用 Dispose?)
本文介紹了SqlTransaction 是否需要調用 Dispose?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我需要在 SqlTransaction 的 finally 塊中調用 dispose 嗎?假設開發者沒有在任何地方使用 USING,只是嘗試/捕獲.

Do I need to call dispose in the finally block for SqlTransaction? Pretend the developer didnt use USING anywhere, and just try/catch.

SqlTransaction sqlTrans = con.BeginTransaction();

try
{
     //Do Work
sqlTrans.Commit()
}
catch (Exception ex)
        {

           sqlTrans.Rollback();
        }

 finally
        {
            sqlTrans.Dispose();
            con.Dispose();
        }

推薦答案

我是否需要使用try-finallyusing-statement 來處理SqlTransaction?

Do I need to use try-finally or the using-statement to dispose the SqlTransaction?

擁有它并沒有什么壞處.對于實現 IDisposable 的每個類都是如此,否則它會不實現這個接口.

It does not hurt to have it. This is true for every class implementing IDisposable, otherwise it would not implement this interface.

但通常垃圾收集器處理未引用的對象(這并不意味著 GC 調用了 dispose,這 不正確),因此您只需要非托管資源.但是因為我也不想在所有其他變量上調用 dispose 或使用 using-statement 無處不在,研究類的 Dispose 方法的實際實現總是值得的.

But normally the garbage collector deals with unreferenced objects(it doesn't mean that the GC calls dispose, which isn't true), so you need it only for unmanaged resources. But because i also don't want to call dispose on every other variable or use the using-statement everywhere, it it's always worth to look into the actual implementation of the class' Dispose method.

SqlTransaction.Dispose:

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        SNIHandle target = null;
        RuntimeHelpers.PrepareConstrainedRegions();
        try
        {
            target = SqlInternalConnection.GetBestEffortCleanupTarget(this._connection);
            if (!this.IsZombied && !this.IsYukonPartialZombie)
            {
                this._internalTransaction.Dispose();
            }
        }
        catch (OutOfMemoryException e)
        {
            this._connection.Abort(e);
            throw;
        }
        catch (StackOverflowException e2)
        {
            this._connection.Abort(e2);
            throw;
        }
        catch (ThreadAbortException e3)
        {
            this._connection.Abort(e3);
            SqlInternalConnection.BestEffortCleanup(target);
            throw;
        }
    }
    base.Dispose(disposing);
}
        

在不了解這里發生的所有(或任何事情)的情況下,我可以說這不僅僅是一個簡單的 base.Dispose(disposing).因此,確保 SqlTransaction 被釋放可能是一個好主意.

Without understanding all(or anything) what is happening here i can say that this is more than a simple base.Dispose(disposing). So it might be a good idea to ensure that a SqlTransaction gets disposed.

但是因為 SqlConnection.BeginTransaction 創建了事務,所以 反映這一點:

But because SqlConnection.BeginTransaction creates the transaction it could also be a good idea to reflect this also:

public SqlTransaction BeginTransaction(IsolationLevel iso, string transactionName)
{
    SqlStatistics statistics = null;
    string a = ADP.IsEmpty(transactionName) ? "None" : transactionName;
    IntPtr intPtr;
    Bid.ScopeEnter(out intPtr, "<sc.SqlConnection.BeginTransaction|API> %d#, iso=%d{ds.IsolationLevel}, transactionName='%ls'
", this.ObjectID, (int)iso, a);
    SqlTransaction result;
    try
    {
        statistics = SqlStatistics.StartTimer(this.Statistics);
        SqlTransaction sqlTransaction = this.GetOpenConnection().BeginSqlTransaction(iso, transactionName);
        GC.KeepAlive(this);
        result = sqlTransaction;
    }
    finally
    {
        Bid.ScopeLeave(ref intPtr);
        SqlStatistics.StopTimer(statistics);
    }
    return result;
}

如你所見.GC 還將在創建事務時保持連接處于活動狀態.它也不持有對交易的引用,因為它只返回它.因此,即使連接已被處理,它也可能不會被處理.處理交易的另一個論據.

As you can see. The GC will also keep the Connection alive when a Transaction is created. It also doesn't hold a reference to the transaction since it only returns it. Hence it might not be disposed even when the connection is already disposed. Another argument to dispose the transaction.

您還可以查看TransactionScope 類 比 BeginTransaction 更安全.查看這個問題了解更多信息.

You might also have a look at the TransactionScope class which is more fail-safe than BeginTransaction. Have a look at this question for more informations.

這篇關于SqlTransaction 是否需要調用 Dispose?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

SQL Server 2005 Transaction Level and Stored Procedures(SQL Server 2005 事務級和存儲過程)
Yield return from a try/catch block(try/catch 塊的收益回報)
Should I call Parameters.Clear when reusing a SqlCommand with a transation?(重用帶有事務的 SqlCommand 時,我應該調用 Parameters.Clear 嗎?)
Reason for System.Transactions.TransactionInDoubtException(System.Transactions.TransactionInDoubtException 的原因)
How do I use TransactionScope with MySql and Entity Framework? (getting Multiple simultaneous connections...are not currently supported error)(如何將 TransactionScope 與 MySql 和實體框架一起使用?(獲取多個同時連接...目前不
what does a using statement without variable do when disposing?(處理時不帶變量的 using 語句有什么作用?)
主站蜘蛛池模板: 三级黄色片在线播放 | 中文字幕精品视频 | 成人午夜电影在线观看 | 精品一区免费 | 草草视频在线播放 | 亚洲 欧美 日韩 在线 | 91免费入口| 久久爱一区 | 久久69精品久久久久久久电影好 | 亚洲成人精品久久久 | 一区二区三区在线免费观看 | 天天看天天摸天天操 | 日本不卡一区 | 亚洲精品视频免费 | 久久久久久蜜桃一区二区 | 成人亚洲性情网站www在线观看 | 在线日韩| 色婷婷亚洲国产女人的天堂 | 欧美成人一区二区三区片免费 | 日韩欧美国产不卡 | 91福利网址 | 免费看91| 一区欧美| 免费观看毛片 | 野狼在线社区2017入口 | 亚洲在线一区二区 | 久久机热 | 欧美阿v| 在线观看免费观看在线91 | 国产精品一区二区av | 亚洲欧洲在线视频 | 国产精品久久久久久久久免费软件 | 日日操夜夜操天天操 | 亚洲精品一区二区网址 | 日韩激情在线 | 91精品国产一区二区三区 | 成人欧美一区二区三区色青冈 | 国产在线一区二区三区 | 欧美日韩精品 | 欧美激情一区二区三区 | 欧美视频第二页 |