【发布时间】:2014-10-22 05:36:02
【问题描述】:
对于我的 rails 应用程序,我从 mysql 数据库表中找到了重复记录。
user_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::Validations#save 结合使用并不能保证不存在重复记录插入,因为应用程序级别的唯一性检查天生就容易出现竞争条件。如果您使用具有“可序列化”隔离级别的事务,甚至可能发生这种情况。
我检查了数据库隔离级别,它是“REPEATABLE-READ”,而不是“serializable”。
SELECT @@global.tx_isolation;
REPEATABLE-READ
我可以添加复合唯一索引来解决这个问题。
add_index :user_product, [:product_id, :user_id], unique: true
但我希望找到根本原因,任何人都可以帮助我。非常感谢!
【问题讨论】:
-
ID不是主键吗?
-
是的,它不是主键
标签: mysql ruby-on-rails ruby database concurrency