对于我的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