對於我的Rails應用程序,我發現mysql數據庫表的重複記錄。併發導致重複記錄插入
user_product表
ID | user_id | product_id |數額| created_at | update_at
181115 | 811115 | 1800 | 2 | 2014-10-16 03:00:13 | 2014-10-16 03:03:58
181116 | 811115 | 1800 | 2 | 2014-10-16 03:00:13 | 2014-10-16 03:03:58
但我在user_product模型中添加了validates_uniqueness_of。
class UserProduct < ActiveRecord::Base
validates_uniqueness_of :product_id, scope: :user_id
......
end
我從rails doc找到了一些有用的信息。
在使用用ActiveRecord ::驗證#結合這個驗證方法節省並不能保證沒有重複記錄插入的,因爲在應用程序級別唯一性檢查本身容易出現競爭情況。如果您使用具有「可序列化」隔離級別的事務,則甚至可能發生這種情況。
我檢查了數據庫隔離級別,它是「REPEATABLE-READ」,而不是「可序列化」。
SELECT @@global.tx_isolation;
REPEATABLE-READ
我可以添加複合唯一索引來解決這個問題。
add_index :user_product, [:product_id, :user_id], unique: true
但我希望找到根本原因,任何人都可以幫助我。非常感謝!
是否ID不是主鍵? – 2014-10-22 05:50:10
是的,它不是主鍵 – pangpang 2014-10-22 05:58:32