[英]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
正在讀取從某個來源流式傳輸的非常大(數百萬行)的記錄集合。
我的問題是:
myObj
變量引用的對象是否可以在我們提交事務之前被垃圾回收,或者我們是否有效地將它們全部加載到 memory 中?
我們設置要執行的所有SQL命令都存儲在memory中直到我們提交事務,還是立即發送到數據庫?
我是否理解正確,這會鎖定[MyTable]
直到我們提交事務?
在我們提交事務之前,myObj 變量引用的對象可以被垃圾收集嗎
是的。 一旦 ExecuteSqlRaw 完成,EF 將不會保留對 myObj 引用的 object 的任何引用,並且可以收集它。
我們設置要執行的所有SQL命令都存儲在memory中直到我們提交事務,還是立即發送到數據庫?
它們被ExecuteSqlRaw
立即發送到數據庫,插入行並將事務日志記錄寫入內存中的日志緩沖區。 事務只是阻止語句等到日志記錄硬化到磁盤,並允許您回滾整個事務。 而且連日志記錄都沒有保存在服務器上的memory; 它們將被異步地加固到日志文件中,並在回滾的情況下從那里讀回。
我是否理解正確,這會鎖定 [MyTable] 直到我們提交事務?
SQL 服務器將只鎖定插入的行,除非您插入的行太多以至於觸發了鎖升級。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.