Closed Yumitoya8569 closed 9 months ago
只更新不插入 可以用
db.Fastest
有这个功能
要插入+更新的 透過Storage來處理有上述疑慮(1.要遍歷資料表, 2.有鍵值重複損壞資料表的風險) 所以才發這個issue討論
另外一個衍生議題 Fastest.BulkCopy這個功能也是沒鍵值檢查的話有損壞資料表的風險 如果要確保BulkCopy的絕對不會有問題, 一樣要在BulkCopy前遍鎖表並遍歷鍵值 BulkCopy結束後才解鎖資料表
是否能評估安全版本? 方案是:
db.BeginTran();
db.Storageable(getAll)
.TranLock()//启用锁
.ExecuteSqlBulkCopy();
db.CommitTran();
SqlSugarCore 5.1.4.108-preview02 升级到这个版本 对于 PageSize(1000)也支持了锁以前不支持的
db.BeginTran();
//TranLock使用行锁
db.Storageable
db.CommitTran();
是這樣的, Oracle不支持BulkCopy事務 再加上鍵值檢查 如有其他程式也正在寫入 撈取的鍵值有可能是舊的 才有了這次的提議
您再評估看看有沒有納入庫的價值, 謝謝
原来如此,目前还真只有oracle bulkcopy不支持外部事务,研究一下
SqlSugarCore 5.1.4.109-preview02 已支持了
db.Fastest<UnitaafdsTest>() .BulkMerge(list2);
列新到最新预览版本就行了
至于 Fastest.BulkCopy的Safe 文档有修复方案 或者你直接用
SqlSugarCore 5.1.4.109-preview02 已支持了
db.Fastest<UnitaafdsTest>() .BulkMerge(list2);
还有疑问发新贴
疑慮
目前批量新增或插入, sugar提供的解決方案是這樣的
1.對於大表的大型Upsert, 透過Storage需要遍歷當前資料庫, 效能可能不是那麼理想 2.部分資料庫的Bulk操作會放棄對PK約束的檢查, 如果Upsert途中有Storage不知道的新資料從其他系統插入此表, 有低概率導致表不可用
提案
出於以上原因, 不知道是否能評估BulkMerge或BulkUpsert功能? 行為類似BulkUpdate, 把資料BulkCopy塞到一個臨時表再透過Merge或Upsert語句更新主表