您的代碼不是線程安全的:如果兩個用戶同時訪問該頁面,則ViewCount將增加1而不是2(因爲該值由DB消費者而不是DB本身增加)。您可以通過直接運行SQL UPDATE Products SET ViewCount = ViewCount + 1 WHERE ProductId = @id
來解決此問題。您的DBMS將提供併發保護。
總之,要防止觀看次數在同一會議上通過其他視圖遞增只使用存儲在會話HashSet的,就像這樣:
public ActionResult Details(Int32 id) {
HashSet<Int32> productsSeen = (HashSet<Int32>)Session["ProductsSeen"];
if(productsSeen == null) {
Session["ProductsSeen"] = productsSeen = new HashSet<Int32>();
}
if(!productsSeen.Contains(id)) {
db.Execute("UPDATE Products SET ViewCount = ViewCount + 1 WHERE ProductId = @id", new { id = id }); // psuedocode. This isn't a real EF construct.
db.SaveChanges();
}
return View(product);
}
來源
2012-08-31 13:16:10
Dai
你可以重構它以減少重複的代碼。 – Dai
你是對的,但這是示例代碼 –