我知道有與唯一索引如何解決RoR中validates_uniqueness_of中的競爭條件?
validates_uniqueness_of :attribute
RoR中
的,因爲在罕見的情況下,競爭狀態的問題,有兩個要求,一個緊隨另一個。
我讀過的解決方案是爲每個模型請求設置一個單獨的唯一索引,這會在競態條件下引發錯誤。
我不明白這是如何工作的。 如果人A提出請求,那麼人B,他們得到相同的索引?這是如何運作的?
我知道有與唯一索引如何解決RoR中validates_uniqueness_of中的競爭條件?
validates_uniqueness_of :attribute
RoR中
的,因爲在罕見的情況下,競爭狀態的問題,有兩個要求,一個緊隨另一個。
我讀過的解決方案是爲每個模型請求設置一個單獨的唯一索引,這會在競態條件下引發錯誤。
我不明白這是如何工作的。 如果人A提出請求,那麼人B,他們得到相同的索引?這是如何運作的?
由於rails無法鎖定數據庫並且經常同時運行多個線程,所以發生競態條件。
要了解競爭條件是如何發生的,想想什麼是需要一個唯一性檢查,我給兩個線程的一個例子:
讓我們假設人A和B要保存新具有屬性name
的BlogPost,它必須是唯一的。
...現在有兩家相關博客文章與同名。
沒有什麼能夠阻止這種情況發生,這是因爲「lookup [」和「save」動作是兩個單獨的事情,因此可能會以上述方式發生。
但是...當你把一個唯一的索引在數據庫上...什麼情況是這樣的:
結果:只有一個博客帖子名爲
現在 - 些什麼你問...什麼我假設是錯誤的理解......和指標。不是ID。 每個記錄沒有得到相同的索引。 沒有記錄得到的指數。
可以有點假裝指數是已經被設定此列的所有值的查找表。
對於非唯一索引i會發生什麼s你有一個所有值的列表......以及哪些記錄具有該值的列表。例如:
小工具: 顏色:藍色 IDS:1,3,7 綠色標識:2,4 紅色標識:5,6
(完全是編造的例子,一點也不像現實)
當指數具有唯一性約束,它只是具有相同的名單,但只允許數據庫來存儲每個值一個 ID,如果你嘗試存儲一個又一個......它拋出一個異常
使用'UNIQUE'約束也意味着你需要成爲pr仔細閱讀步驟8,您將在保存時發現異常。儘量不要讓你的應用程序隨意爆炸,如果這是預料之中的,並從一個有意義的錯誤中恢復。 – tadman
Ah so Peron A正在保存到DB的第7列,而B人將訪問同一第7列......這是發生競爭狀態的標誌!非常感謝! @tadman是的,謝謝你的提醒:)我一定會把頁面從該錯誤中保存 – innhyu