我尝试在播种时使用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
我有什么方法可以做到这一点吗?
答案 0 :(得分:1)
执行所需操作的最简单方法是发出select for update
命令。一旦选择了一组行,它们将被锁定用于其他线程,直到您执行某些操作导致数据库释放锁定。
并非每个RDBMS都支持该命令,而某些旧数据库会在您从其中一个行中选择时锁定整个表。您可能希望从应用程序端获得一个RDBMS无关的解决方案,以避免此类问题,保留将来切换数据库的自由,而无需额外的担忧。
考虑在您的表中添加一个名为boolean
的{{1}}列,您可以在允许该行包含在任何结果集中之前阅读该列。这种方法似乎花费很少,同时允许您避免数据库特定的问题。