2017-08-17 1 views
0

私はQAの目的のために私のPostgreSQLデータベース(特にordersというテーブル)の不定ロックを取得しようとしています。要するに、テーブル上の特定のロックがカラムを追加するためのデータベース移行を阻止するか、無期限にブロックするかどうかを知りたい(私はALTER TABLEグラブをACCESS EXCLUSIVE LOCKと考えている)。QAのためにRails(postgresデータベース)でデータベースを不定期にロックする方法は?

私の計画はにある:列(ACCESS EXCLUSIVE LOCKをつかむALTER TABLE文)を追加するための移行を実行ordersテーブル上のテーブルロックまたは行ロック

    1. グラブ
    2. は、(2)がブロックされているかどうかを確認するためにread文を発行します(ACCESS EXCLUSIVE LOCKブロックが読み込みますので、QAを試みることに問題があります)。

    どうすればよいですか? Rails Consoleを介して注文と呼ばれるテーブルの行ロックを取得するにはどうすればよいですか?どのように私はこれを行うことができますか?

    私の計画は意味がありますか?

    UPDATE

    実際に列を追加するテーブルの移行等ACCESS排他ロックを取得ALTER TABLE文を遮断ないオープン行レベルのトランザクションを判明。例えば、私は1つのプロセスでこのコードを実行します。ordersテーブルに列を追加するために、別のプロセスで

    Order.first.with_lock do 
        binding.pry 
    end 
    

    このブロック私の移行。その移行のACCESS EXCLUSIVE LOCKは、orders表に対するすべての読取りおよび選択文をブロックし、エンド・ユーザーに問題を引き起こします。

    これはなぜですか?

  • 答えて

    0

    たとえば、where句がさまざまな表から行を選択しているとします。途中で、他のトランザクションがそのテーブルに列を追加します。今度は、以前よりも多くのフィールドを取り戻しています。あなたのアプリケーションはこれをどのように扱うべきでしょうか?

    +0

    私はよく分かりませんが、どうしていますか? – Jwan622

    +0

    また、[this](https://www.postgresql.org/docs/9.4/static/explicit-locking.html)を読んだあと、長時間実行されているSELECTステートメント(ACCESS SHAREロック)が移行をブロックできるようですACCESS EXCLUSIVEロックを取得します。そうですか? – Jwan622

    +0

    読み書きはお互いをブロックする傾向がありませんが、テーブルなどを変更するものは、データを変更するものによってブロックされたりブロックされたりする傾向があります。 –

    関連する問題