タグ

ブックマーク / blog.kamipo.net (1)

  • create_or_find_byでcreateもfind_byも失敗させる - かみぽわーる

    Active Recordの話です。 create_or_find_byの実装はcreateしてみてユニーク制約に引っかかったらfind_byしてみるなので、ふつうに考えるとfind_byは成功しそうに見えます。 def create_or_find_by(attributes, &block) transaction(requires_new: true) { create(attributes, &block) } rescue ActiveRecord::RecordNotUnique find_by!(attributes) end ですが、以下のスクリプトを実行するとcreate_or_find_byはcreateがRecordNotUnique例外を吐いたあと、find_byもRecordNotFound例外を吐いてレコードを見つけられずに死にます。 ちょっと今から会なので原

    create_or_find_byでcreateもfind_byも失敗させる - かみぽわーる
    koba789
    koba789 2020/12/16
    最初の find_by は locking read ではないので 並走するトランザクションの create が成功し、その後の c_or_f_by の insert は失敗する。しかし最初の f_by でスナップショットが撮れているので select 結果は0行のまま
  • 1