Entify Framework 如何在高並發時避免重複插入數據?

例如:發送驗證碼的表,每次都會執行如下操作:

1,檢查當前電話號碼,上一次發送驗證碼的情況,是否剛剛發送過。

2,如果沒有發送過,則發送新的驗證碼。

此時,使用Entity Framework,由於「查詢」和「插入」操作無法做到「原子性」,會導致高並發(惡意刷介面)時,插入無效的數據。


可以用另外一張表來存儲 某段時間 (根據你的業務需求,多長時間裡對同樣的號碼不允許重複發送, 你還需要單獨的後台job, 維護這張表) 里發送過的驗證碼, 對電話號碼加上unique約束。

把這些操作放在一個transaction里:

  • 插入 另外一張表
  • 插入 原來的表

如果有重複的話,transaction會rollback.


一,查詢和插入的問題,這個存在一種叫查詢鎖,可以一定程度上解決你的問題,這種方案只能依賴於存儲系統(可能是db也可能是xml),老實來說生產環境應該儘可能避免此類設計。

二,關於你舉例的這個簡訊驗證碼問題,如果是我設計的話,使用redis存儲,用手機號作為key,值使用字典結構,時間為鍵,以及對應驗證碼,業務端檢驗時如果鍵值存在,則檢查鍵值時間範圍


可以設置 Transaction Isolation Levels = READ COMMITTED 來在防止dirty read.

PS: 話說這種問題不是應該出現在Stack Overflow么


把手機號加入redis做鎖, 發完就刪除,可以用於分散式架構


Actor模型很適合這種並發下的ABA問題~


SELECT 加上UPDATE lock


推薦閱讀:

TAG:SQL | ASPNET | C | ASPNETMVC | EntityFramework |