[英]How do I query the database after a Postgres exception?
插入Postgres數據庫時,在處理並發問題時遇到一些麻煩。 該模型在索引列上具有唯一性約束,Postgres表也是如此。 有時,兩個線程嘗試同時插入同一條記錄(這是不可避免的),在這種情況下,兩個線程都通過了模型驗證,但是第二個線程違反了Postgres驗證。 所以我發現了異常,一切正常。 這不是問題。
問題是我的方法需要從數據庫返回對象,所以我查詢數據庫以獲取第一個線程插入的記錄(我可以放心地假定它與第二個線程中的記錄相同)。 但是,此操作失敗,因為由於插入失敗,事務仍處於無效狀態。
我的問題是:如何避免在救援塊中引發第二個異常,和/或啟用該方法以返回由第一個線程插入的記錄?
class Place
validates :index_column, uniqueness: true, allow_nil: true
def self.create_and_insert(some_params)
more_params = additional_params(some_params)
place = Place.new(some_params, more_params)
begin
place.save # Insert into place table. This initiates a transaction.
rescue ActiveRecord::RecordNotUnique => e
# Oops! Another thread beat us to it.
# The transaction is now in an invalid state.
place = Place.find_by(index_column: some_params.id) # This throws a new exception
end
place
end
end
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.