簡體   English   中英

EF 核心事務原始 SQL memory 使用

[英]EF Core Transactions raw SQL memory use

我試圖了解具有大量內部命令的 EF Core 事務如何使用 memory。

假設我有這樣的代碼:

using var reader = new MyReader(myStream);
using var context = new BloggingContext();
using var transaction = context.Database.BeginTransaction();

try
{
    while (!reader.EndOfStream()) 
    {
        var myObj = reader.ReadNextObject();
        context.Database.ExecuteSqlRaw("INSERT INTO [MyTable] ([Col1], [Col2]) VALUES ({0}, {1})", 
                                       myObj.prop1, myObj.prop2);
    }

    transaction.Commit();
}
catch (Exception)
{
    // Exception handling
}

MyReader正在讀取從某個來源流式傳輸的非常大(數百萬行)的記錄集合。

我的問題是:

  1. myObj變量引用的對象是否可以在我們提交事務之前被垃圾回收,或者我們是否有效地將它們全部加載到 memory 中?

  2. 我們設置要執行的所有SQL命令都存儲在memory中直到我們提交事務,還是立即發送到數據庫?

  3. 我是否理解正確,這會鎖定[MyTable]直到我們提交事務?

在我們提交事務之前,myObj 變量引用的對象可以被垃圾收集嗎

是的。 一旦 ExecuteSqlRaw 完成,EF 將不會保留對 myObj 引用的 object 的任何引用,並且可以收集它。

我們設置要執行的所有SQL命令都存儲在memory中直到我們提交事務,還是立即發送到數據庫?

它們被ExecuteSqlRaw立即發送到數據庫,插入行並將事務日志記錄寫入內存中的日志緩沖區。 事務只是阻止語句等到日志記錄硬化到磁盤,並允許您回滾整個事務。 而且連日志記錄都沒有保存在服務器上的memory; 它們將被異步地加固到日志文件中,並在回滾的情況下從那里讀回。

我是否理解正確,這會鎖定 [MyTable] 直到我們提交事務?

SQL 服務器將只鎖定插入的行,除非您插入的行太多以至於觸發了鎖升級。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM