Rails 关于 rails 中的 orm 机制中,save 之后的 id 是何时取到的,是否存在竞争问题?

true_log · 2012年07月18日 · 最后由 true_log 回复于 2012年07月18日 · 2056 次阅读

我刚接触 rails,刚看到 db 和 model 这一块,有个问题: 常见到的例子如下:

Event 是一个脚本生成的 model

event = Event.new
event.field1 = 'str1'
event.field2 = 'data1'
...
event.save

=begin

irb 到这里提示如下,是其执行的 sql 查询命令吧:

(0.1ms) begin transaction

  SQL (9.3ms)  INSERT INTO "events" ("capacity", "created_at", "description", "is_public", "name", "updated_at") VALUE
S (?, ?, ?, ?, ?, ?)  [["capacity", 20], ["created_at", Tue, 17 Jul 2012 16:12:25 UTC +00:00], ["description", "i love
 you"], ["is_public", nil], ["name", "meme"], ["updated_at", Tue, 17 Jul 2012 16:12:25 UTC +00:00]]

(73.3ms) commit transaction

=end

put event.id #这里!event.id 值为 1 了

event.id 之前还是 nil,现在已经有值了,神马情况?上面的 sql 语句应该是不返回值的吧,那么这个自增的主键值是何时存入 id 里的?什么机制?这种机制能否避免在多线程环境下的竞争险象?

“sql 语句应该是不返回值”这个假设是错误的,不同的数据库驱动可以实现返回还是不返回,这个通信是一次传输还是两次传输就不知道了。

谢谢!终于有达人回复了! 我上面的测试项目用的是 Sqlite 那么在 rails 的实现里,支持的几种数据库 MySQL/Postgres 等等,都可以用这种类似的方式向数据库中加入新行吗? 我是 ruby 新手,不知道怎样去看 rails 的代码实现细节……

需要 登录 后方可回复, 如果你还没有账号请 注册新账号