簡體   English   中英

Postgres異常后如何查詢數據庫?

[英]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

在PostgreSQL中,您可以在事務內設置一個保存點,以便可以回滾導致錯誤的事務部分。 這稱為子交易

您可以在Ruby on Rails中使用它,請參閱文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM