【问题标题】:执行学说迁移时检测到死锁(极光 postgres)
【发布时间】:2022-01-22 23:30:25
【问题描述】:

上下文

环境

后端:symfony 4.4

数据库:PostreSql 10.XX

生产服务器

  • AWS EC2 实例,在 Debian 上,包含后端
  • 包含数据库的 AWS Amazon-Aurora 实例

测试服务器

EC2 实例,在 Debian 上,包含后端和数据库

开发环境

Ubuntu,包含后端和数据库

我想做什么

在许多实体中添加 Gedmo\SotfDelete 的非常简单的迁移

final class Version20211221101121 extends AbstractMigration
{
    public function getDescription(): string
    {
        return 'Add soft delete';
    }

    public function up(Schema $schema): void
    {
        // this up() migration is auto-generated, please modify it to your needs
        $this->addSql('ALTER TABLE xxxxxx ADD deleted_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL');
        $this->addSql('ALTER TABLE xxxxxxx ADD deleted_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL');
        $this->addSql('ALTER TABLE xxxxxxx ADD deleted_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL');
        $this->addSql('ALTER TABLE xxxxxxxx ADD deleted_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL');
        $this->addSql('ALTER TABLE xxxxxxx ADD deleted_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL');
        $this->addSql('ALTER TABLE xxxxxxxx ADD deleted_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL');
        $this->addSql('ALTER TABLE xxxxxxx ADD deleted_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL');
        $this->addSql('ALTER TABLE xxxxxxxx ADD deleted_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL');
    }

    public function down(Schema $schema): void
    {
        // this down() migration is auto-generated, please modify it to your needs
        $this->addSql('ALTER TABLE xxxxxxxxx DROP deleted_at');
        $this->addSql('ALTER TABLE xxxxxxxxx DROP deleted_at');
        $this->addSql('ALTER TABLE xxxxxxxxx DROP deleted_at');
        $this->addSql('ALTER TABLE xxxxxxxxx DROP deleted_at');
        $this->addSql('ALTER TABLE xxxxxxxxx DROP deleted_at');
        $this->addSql('ALTER TABLE xxxxxxxxx DROP deleted_at');
        $this->addSql('ALTER TABLE xxxxxxxxx DROP deleted_at');
        $this->addSql('ALTER TABLE xxxxxxxxx DROP deleted_at');
    }
}

在我尝试之前

  • 我已成功尝试在开发环境中执行迁移
  • 我已成功尝试在测试服务器上执行迁移

问题

当我尝试在生产环境中执行迁移时,它会引发 SQL 错误

SQL 错误跟踪:

  SQLSTATE[40P01]: Deadlock detected: 7 ERROR:  deadlock detected                                                      
  DETAIL:  Process 19401 waits for AccessExclusiveLock on relation 25783 of database 25651; blocked by process 20050.  
  Process 20050 waits for AccessShareLock on relation 25768 of database 25651; blocked by process 19401.               
  HINT:  See server log for query details.

教义错误追踪:

  An exception occurred while executing 'ALTER TABLE xxxxxxxxx ADD deleted_at TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT  
   NULL':                                                                                                                    
                                                                                                                             
  SQLSTATE[40P01]: Deadlock detected: 7 ERROR:  deadlock detected                                                            
  DETAIL:  Process 19401 waits for AccessExclusiveLock on relation 25783 of database 25651; blocked by process 20050.        
  Process 20050 waits for AccessShareLock on relation 25768 of database 25651; blocked by process 19401.                     
  HINT:  See server log for query details. 

在等待查找此问题的原因和解决方案时,我暂时撤消了提交。

你有什么办法解决这个问题吗?

【问题讨论】:

    标签: postgresql symfony doctrine amazon-aurora


    【解决方案1】:

    已解决

    解释

    Postgres 通过在事务期间为表分配锁定规则来保持关系的完整性。这些规则存储在 pg_lock 表中。

    在上述迁移期间,实体之一以及与所有其他实体的关系。

    在迁移执行期间,此表被分配一个 AccessExclusive 类型锁,而其他表被分配一个 AccessShare 类型锁。

    注意事项

    访问独占锁

    • 在持有锁期间阻止所有其他事务以任何方式访问表

    • 限制性锁定模式

    • 被大多数 DDL 语句获取(ALTER TABLE、DROP TABLE)

    AccessShareLock

    • 仅与 AccessExclusiveLock 冲突

    • 由只读的 SELECT 命令获取

    我是如何解决这个问题的

    我在第二次迁移中分离了位于关系中心的表,通过一个接一个地执行迁移来避免冲突。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-22
      • 1970-01-01
      • 2013-09-04
      • 1970-01-01
      相关资源
      最近更新 更多