我的印象是 OrmLite Save 方法做了一個“更新插入”,如果記錄/行存在則更新,否則插入。在
- 對我來說看起來很奇怪的第一件事是錯誤訊息,它表明 PRIMARY 欄位中
CoreObjectListPresentation-Pres的值以PresentationWorker.Presentations.CoreObjectListPresentation-PresentationWorkerModule:TED-RYZEN:37576
然而,正在保存的 POCO 中的 Id 道具與資料庫中已經存在的相同:

和資料庫:

我想了解Update如果已經有一個具有相同值的 PRIMARY KEY的話,我如何才能得到錯誤?但是當我啟用日志記錄功能時,我可以看到 SQL 查詢實際上是一個 INSERT,而不是一個 UPDATE:
SQL: INSERT INTO
PresentationProducer(Id,PresentationType,ModuleChannelName,LastUpdatedTimestamp) VALUES (@Id,@PresentationType,@ModuleChannelName,@LastUpdatedTimestamp) PARAMS: @Id=PresentationWorker.Presentations.CoreObjectListPresentation-PresentationWorkerModule:TED-RYZEN:37576, @Presentation.CoreObjectPresentation , @ModuleChannelName=PresentationWorkerModule:TED-RYZEN:37576, @LastUpdatedTimestamp=2021-11-21 09:09:02
我正在考慮某種形式的競爭條件,但我不確定這到底是怎么發生的。我嘗試在源代碼中找到 SaveAsync,但沒有找到相關代碼。
INSERT ON DUPLICATE KEY UPDATE當 Save 方法用于 MySQL 時,OrmLite 是否可以改進使用該方法?
(使用ServiceStack 5.13.1, .NET5, VS2022, MySqlConnector and db is MySQL8)
uj5u.com熱心網友回復:
OrmLite 在決定是否db.Save*應該插入或更新記錄之前必須檢查記錄是否存在。這為如果 2 個請求嘗試同時保存同一條新記錄同時保存同一條新記錄的可能性留下了空間,如果第一次插入發生在第二次請求檢查之后,則可能會出現競爭條件。
通常,這是一個雙重發布錯誤觸發 2 個以上并發請求的結果。將其更改為使用顯式db.Insert*且db.Update*無濟于事,因為您將獲得 2 次插入的相同回應。
處理此問題的正確方法是在 OrmLite 尚不支持的每個 RDBMS 中使用本機 upsert 功能,請投票支持該功能請求,以便在該功能實作時得到通知。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/362931.html
標籤:mysql 服务栈 ormlite-servicestack
上一篇:使用資料庫中的資料顯示每日增長
