1
我有兩個表:實體框架自動遞增非標識列/併發問題
CREATE TABLE [dbo].[Customers] (
[CustomerId] INT IDENTITY (1, 1) NOT NULL,
CONSTRAINT [PK_dbo.Customers] PRIMARY KEY CLUSTERED ([CustomerId] ASC)
);
CREATE TABLE [dbo].[Campaigns] (
[Id] INT IDENTITY (1, 1) NOT NULL,
[CustomerId] INT NULL,
[CampaignId] INT NULL,
CONSTRAINT [PK_dbo.Campaigns] PRIMARY KEY CLUSTERED ([Id] ASC)
);
Campaigns.CampaignId是獨一無二的每一個客戶ID;因此,它不能是一個身份。因此,從我的網絡應用程序中,我需要在創建Campaign時自動增加CampaignId。在過去,我不得不在單個交易中獲得一個鎖,以獲得下一個最高價併發行插入。我如何在EF中完成同樣的事情而不必擔心或有效管理併發性?
在運動控制器,我有這個(的UserContext是一個靜態輔助類,檢索用戶的當前客戶編號和DB是我的DbContext):
public ActionResult Create(Campaign campaign)
{
if (ModelState.IsValid)
{
int customerId = UserContext.customerId;
int maxCampaignId = db.Campaigns.Where(c => c.CustomerId == customerId).Max(c => c.CampaignId);
campaign.CampaignId = maxCampaignId + 1;
db.Campaigns.Add(campaign);
db.SaveChanges();
return RedirectToAction("Index");
}
return View(campaign);
}
但不會這種風險在每個客戶ID重複的值高併發環境?
編輯:
我忘了提到guid不是一個選項。 Ids必須是整數。
編輯2:
我忘了提及,也有一個用戶表可以具有相同的客戶ID。用戶可以使用相同的CustomerId創建多個Campaigns,這可能會導致併發問題。
我會檢查了這一點。我忘了提到一個guid不是一個選項。 Ids必須是整數。 – Jeff
我不確定HiLo算法是否適用於我。幾個問題: 「CustomerId」基本上是Hi參數,「CampaignId」是Lo參數嗎? 多個客戶可以重複使用CampaignId嗎? 如果我沒有將最大Lo值設置得足夠高,是否意味着客戶有一定數量的'CampaignId's,它們可以在新的'CustomerId'發出之前分配? – Jeff
那麼你可能可以使用CustomerId作爲Hi參數,但是campaignId是你試圖用HiLo算法創建的id。在再次閱讀您的問題並思考更多問題後,您不必擔心自己的情況會出現併發情況,因爲希望單個客戶一次只能創建一個廣告系列。我在這裏假設沒關係,如果customer1和customer2都有1的競選ID。 – Dodecapus