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

使用Rails ActiveRecord的PostgreSQL事务

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

    嘿,伙计们,我创建了一个方法,通过创建一个PostgreSQL临时表,然后在另一个查询中使用它来生成一些数据。我的问题是,如果有多个客户端调用这个函数,我会在一个事务中多次创建和删除临时表吗?或者每次ActiveRecord连接调用都是一个完全独立的事务?下面是我的代码:

    TEMP_TBL_NAME = "temp_tbl"
    
    def self.generate_exclusions(rules, base_query, rule_attrs)
    begin
      ActiveRecord::Base.connection.execute(
        "DROP TABLE IF EXISTS #{TEMP_TBL_NAME};")
    
      # create a temp table with all rule fields
      ActiveRecord::Base.connection.execute(
        "CREATE TEMP TABLE #{TEMP_TBL_NAME} AS #{base_query}")
    
      qs = rules.map do |rule|
        self.rule_query_instance(rule, rule_attrs)
      end.compact.join(" UNION ")
    
      ActiveRecord::Base.connection.execute(qs).to_a
    ensure
      ActiveRecord::Base.connection.execute(
        "DROP TABLE IF EXISTS #{TEMP_TBL_NAME};")
    end 
    end 
    

    因此,如果多个客户机再次调用此方法,ActiveRecord的每个实例是否:Base.connection.execute执行(诸如此类)创建一个全新的事务?如果每个事务实际上是独立的,那么我就不必担心多个客户机使用的方法正确吗?如果这些都是在一个事务之前创建的,那么如何最好地处理多个客户端在一个事务中不断创建和删除这个临时表的问题?

    谢谢你的帮助。

    0 回复  |  直到 6 年前