【问题标题】:Disable transactions in ActiveRecord在 ActiveRecord 中禁用事务
【发布时间】:2010-04-20 22:04:11
【问题描述】:

如何在 Rails 的 ActiveRecord 中禁用事务?我有一个特定的情况,我希望他们离开我似乎找不到任何有用的东西。有没有可能?

【问题讨论】:

    标签: ruby-on-rails ruby database activerecord


    【解决方案1】:

    穷人的“不交易”

    # Force the loading of AR stuff
    ActiveRecord::Base.connection.execute('SELECT 1')
    
    # Remove transactions
    ActiveRecord::ConnectionAdapters::MysqlAdapter.class_eval do
      def begin_db_transaction
      end
    
      def commit_db_transaction
      end
    end
    

    【讨论】:

      【解决方案2】:

      与丹尼尔的回答类似,但我发现我还必须禁用保存点才能正常工作。在 Rails 3.2.22.2 上测试。

      ActiveRecord::ConnectionAdapters::Mysql2Adapter.class_eval do
        def begin_db_transaction
        end
      
        def commit_db_transaction
        end
      
        def create_savepoint
        end
      
        def rollback_to_savepoint
        end
      
        def release_savepoint
        end
      end
      

      【讨论】:

        【解决方案3】:

        transaction 是 ActiveRecord::Base 上的一个类方法,所以你可以这样做:

        Model.transaction do
          ...
        end
        

        或者如果您更喜欢不使用特定型号:

        ActiveRecord::Base.transaction do
          ...
        end
        

        这也可能取决于您使用的数据库,我确定它适用于 mysql 但不确定其他数据库。

        【讨论】:

        • 你误读了这个问题。我想禁用事务,而不是使用它们。您的示例明确使用事务。 ActiveRecord 在不同的点使用事务,而那些是我想要删除的。
        • 将此标记为无关紧要。
        • 感谢您的回答,mcostanza。这对我有用,即使它不适用于 OP。
        • 有点相关:stackoverflow.com/questions/344247/rails-transactions:“在 MySQL 中使用事务无需禁用自动提交模式。只需显式开始事务即可。”
        • 当然“禁用事务”只是意味着“在单个事务中执行以下操作”?在这种情况下,这是正确的答案..
        猜你喜欢
        • 2014-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-14
        • 1970-01-01
        • 1970-01-01
        • 2012-01-09
        相关资源
        最近更新 更多