为了防止在迁移到生产站点期间出现数据库事务错误,我们遵循了https://github.com/LendingHome/zero_downtime_migrations中概述的建议(由https://robots.thoughtbot.com/how-to-create-postgres-indexes-concurrently-in专门概述),但是在一个特别大的表上创建索引的过程中,即使是索引创建的“并发”方法也会锁定该表,并导致对该表的任何ActiveRecord创建或更新都会导致它们各自的事务失败并出现PG::InFailedSqlTransaction异常。
下面是我们运行Rails 4.2 (使用ActiveRecord 4.2.7.1)时的迁移情况:
class AddTypeIndexToModel < ActiveRecord::Migration
disable_ddl_transaction!
def change
add_index :model, :model_type_id, algorithm: :concurrently
end
end发布于 2017-10-19 00:02:17
事实证明,这个问题与迁移无关,而是在向同一个表中添加新列的同一批处理中运行的先前版本。
因为我们向表中添加了一列,所以我们在Active Record https://github.com/rails/rails/issues/12330中遇到了这个错误,它实质上会导致事务中的所有ActiveRecord操作由于陈旧的PreparedStatement而失败,直到服务器重新启动。
从现在开始,我们将在迁移中使用该问题中描述的解决方法。
https://stackoverflow.com/questions/46797811
复制相似问题