代码之家  ›  专栏  ›  技术社区  ›  Ins0maniac

Rails,锁定数据库中的记录

  •  0
  • Ins0maniac  · 技术社区  · 6 年前

    我正在尝试在播种时锁定数据库中的一条记录(使用API)。通过锁定,我的意思是——不能在某些电影下创建主题,或者只是禁用“show”方法。 如果我让你看看我的种子,那就简单多了。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
    

    最后两行是必不可少的-我想锁定电影,而不是销毁它,制作如下内容:

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

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   MarsAtomic    6 年前

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

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

    考虑添加 boolean 已调用列 locked 在允许将行包括在任何结果集中之前,可以读取的表。这种方法似乎成本最低,同时允许您避免特定于数据库的问题。