2017-08-17 53 views
0

我試圖在我的Postgresql數據庫(特別是在一個叫做訂單的表格上)上獲得一個無限期的鎖定,用於質量保證目的。總之,我想知道表上的某些鎖是否阻止或無限制地阻止添加列的數據庫遷移(我認爲ALTER TABLE獲取ACCESS EXCLUSIVE LOCK)。如何在Rails(postgres數據庫)中獲取對數據庫的無限制鎖定以實現QA目的?

我的計劃是:

  1. 搶表鎖或將訂單表
  2. 運行遷移增加一列(即抓住一個ACCESS EXCLUSIVE LOCK ALTER TABLE語句)行鎖
  3. 發出讀取語句以查看是否(2)被阻止(ACCESS EXCLUSIVE LOCK塊讀取,所以這將是我嘗試QA的問題)。

如何做到這一點?如何在通過Rails控制檯調用訂單的表上獲取行鎖?我還能怎麼做?

我的計劃有意義嗎?

UPDATE

原來開行級交易真正做到阻止搶ACCESS獨佔鎖一樣,添加列的表遷移ALTER TABLE語句。例如,當我在一個進程中運行這段代碼:

Order.first.with_lock do 
    binding.pry 
end 

它阻止我在另一個進程遷移到列添加到訂單表。該遷移的ACCESS EXCLUSIVE LOCK會阻止對訂單表的所有讀取和選擇語句,從而對最終用戶造成問題。

這是爲什麼?

回答

0

假設您正在交易中,從具有各種where子句的表中選擇行。中途,其他一些事務向該表添加了一列。現在你回到了比以前更多的領域。你的應用程序應該如何處理這個問題?

+0

我不確定,你在做什麼? – Jwan622

+0

此外,它看起來像在閱讀[this](https://www.postgresql.org/docs/9.4/static/explicit-locking.html)之後,似乎像長時間運行的SELECT語句(ACCESS SHARE鎖)可以阻止遷移獲得一個ACCESS EXCLUSIVE鎖。是對的嗎? – Jwan622

+0

對。讀取和寫入不會彼此阻塞,但是任何改變表格等的東西都會阻止/被更改數據的東西阻塞。 –

相關問題