我得到一个例外,我想了解原因。我创建了一个 git repo,所以任何人都可以测试它。
安装了 Devise 的 rails 应用程序很新鲜。
运行尝试创建相同用户的应用程序和此脚本:
1000.times do
fork do
`curl -d "user[email]=your@mail.com&user[password]=pwd&user[password_confirmation]=pwd" localhost:3000/users`
end
end
我得到以下异常:
An ActiveRecord::RecordNotUnique occurred in registrations#create:
Mysql2::Error: Duplicate entry 'your@mail.com' for key 'index_users_on_email': INSERT INTO `users` (`authentication_token`, `confirmation_sent_at`, `confirmation_token`, `confirmed_at`, `created_at`, `current_sign_in_at`, `current_sign_in_ip`, `email`, `encrypted_password`, `failed_attempts`, `last_sign_in_at`, `last_sign_in_ip`, `locked_at`, `remember_created_at`, `reset_password_sent_at`, `reset_password_token`, `sign_in_count`, `unconfirmed_email`, `unlock_token`, `updated_at`) VALUES (NULL, '2013-01-24 16:48:23', 'GQwbJzsawxRsbvhp1LkR', NULL, '2013-01-24 16:48:23', NULL, NULL, 'your@mail.com', '$2a$10$koMNiiZQuhkeWhmYV8PtcOUlvi6rZHTKMs82MGWNa2M/GsUQ0cIHO', 0, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, '2013-01-24 16:48:23')
activerecord (3.2.11) lib/active_record/connection_adapters/abstract_mysql_adapter.rb:245:in `query'
为什么我得到这个异常而不是验证错误?如果我尝试使用已从网页“http://localhost:3000/users/sign_up”使用的电子邮件创建用户,我不会收到此异常,而是出现验证错误...
如果我在没有 fork 的情况下运行脚本(请求是顺序的),我不会收到错误。
似乎是一个竞争条件问题。