Rails,锁定数据库中的记录

时间:2018-01-25 14:25:20

标签: ruby-on-rails locking

我尝试在播种时使用API​​锁定我的数据库中的一条记录。通过锁定我的意思是 - 无法在某些电影下创建主题或只是禁用“显示”。方法。 如果我只是告诉你我的种子,它会更简单.rb文件:

require 'open-uri'

@doc=Nokogiri::XML(open("http://www.kinoballada.info/repertuar/export/small/dzien/xml"))
movie_array = []
@doc.css('dzien').each do |node|
    children=node.children
    movie_array << children.css('tytul').inner_text
    Movie.find_or_create_by(
    :name => children.css('tytul').inner_text
    )
    end
    movies_to_delete = Movie.where.not(name: movie_array)
    movies_to_delete.destroy_all

最后2行是必不可少的 - 我想要锁定电影,而不是破坏它,制作类似的东西:

    movies_to_lock = Movie.where.not(name: movie_array)
    movies_to_lock.??????_all

我有什么方法可以做到这一点吗?

1 个答案:

答案 0 :(得分:1)

执行所需操作的最简单方法是发出select for update命令。一旦选择了一组行,它们将被锁定用于其他线程,直到您执行某些操作导致数据库释放锁定。

并非每个RDBMS都支持该命令,而某些旧数据库会在您从其中一个行中选择时锁定整个表。您可能希望从应用程序端获得一个RDBMS无关的解决方案,以避免此类问题,保留将来切换数据库的自由,而无需额外的担忧。

考虑在您的表中添加一个名为boolean的{​​{1}}列,您可以在允许该行包含在任何结果集中之前阅读该列。这种方法似乎花费很少,同时允许您避免数据库特定的问题。