我有一个将用户输入插入数据库的 Rails 3 应用程序。
每次用户单击提交按钮时,所有字段(姓名、电子邮件、电话号码等)都将插入到数据库中。但是如果两个用户同时提交表单,数据库会不会陷入死锁状态呢?
我发现 rails 3 有一个线程模式,可以config.threadsafe!
在production.rb
. 但我不确定这是否也会解决数据库死锁问题。
有没有办法解决或避免这种情况?
谢谢!
我有一个将用户输入插入数据库的 Rails 3 应用程序。
每次用户单击提交按钮时,所有字段(姓名、电子邮件、电话号码等)都将插入到数据库中。但是如果两个用户同时提交表单,数据库会不会陷入死锁状态呢?
我发现 rails 3 有一个线程模式,可以config.threadsafe!
在production.rb
. 但我不确定这是否也会解决数据库死锁问题。
有没有办法解决或避免这种情况?
谢谢!
在数据库级别,不存在数据库进入死锁状态的危险。像 MySQL 这样的数据库非常健壮,即使每秒更新 1000 次也不会导致死锁。
但是,使用 Active Record 的Optimistic 锁定支持来提醒第二个用户该记录在他们开始编辑后发生了更改可能是值得的。
上述链接文档中的以下示例应有助于解释这一点:
p1 = Person.find(1)
p2 = Person.find(1)
p1.first_name = "Michael"
p1.save
p2.first_name = "should fail"
p2.save # Raises a ActiveRecord::StaleObjectError
顺便说一句config.threadsafe!
,用于配置兼容的服务器,它们可以使用线程并发来服务器请求,而不是更常见的 Rails 进程并发。Aaron Pattrrson 有一篇关于线程安全的文章!值得一读。