簡體   English   中英

Rails 4 ActiveRecord事務塊-回滾條件

[英]Rails 4 ActiveRecord Transaction Block - Rollback criteria

嗨,我正在使用ActiveRecords Transaction塊使一堆記錄要么全部被接受,要么全部不被接受。 我將事務塊包含在模型中,並從控制器調用整個函數:

  def self.write_atomic_union_sync
   Union.transaction do
     @sync=Sync.create(sync_date: DateTime.now, user_id: user_id)
     union_array.map do |t|
        Union.create(value2: t[:value2], user_id:t[:user_id],value1: t[:value1],sync_id: @sync[:id])
        #sync.unions.create(t)
     end
   end
  end

我對Union有一些限制,以避免重復的條目。 當我第一次發送測試數據時,帶有聯合記錄的同步對象將存儲到數據庫中。 但是,當我再次提交相同的數據時,並沒有保存並保存了同步。

根據Ruby API指南 ,在事務塊中使用create方法是有效的,但是我也嘗試過在數組之前調用@sync.newunions.new ,然后僅放置@sync.save! 等等在Transaction塊中也沒有成功。

我認為可能是因為聯合創建過程沒有顯式的ROLLBACK異常。 但我不知道為什么..也許有人有幫助的線索? 預先感謝所有人!

(1.2ms)  BEGIN
 Transaction Exists (0.7ms)  SELECT  1 AS one FROM "union" WHERE    ("union"."user_id" = 18 AND "union"."value1" =1111 AND "union"."value2" IS NULL) LIMIT 1

 SQL (0.7ms)  INSERT INTO "syncs" ("sync_date", "user_id", "created_at", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["sync_date","2016-01-13 21:04:48.175245"], ["user_id", 1], ["created_at", "2016-01-13 21:04:48.213958"], ["updated_at", "2016-01-13 21:04:48.213958"]]

 Transaction Exists (0.6ms)  SELECT  1 AS one FROM "transactions" WHERE ("transactions"."user_id" = 18 AND "transactions"."value1" =
 22222 AND "transactions"."value2" IS NULL) LIMIT 1
(27.4ms)  COMMIT

僅當引發異常時,事務塊才會回滾。 您想使用在失敗時會產生異常的create版本: create! 這樣,如果其中一個創建失敗,它將引發異常,從而觸發回滾。 請注意,異常將傳播到事務塊之外,因此您必須在外部捕獲它。 嘗試:

  def self.write_atomic_union_sync
    begin
      Union.transaction do
        @sync=Sync.create!(sync_date: DateTime.now, user_id: user_id)
        union_array.map do |t|
           Union.create!(value2: t[:value2], user_id:t[:user_id],value1: t[:value1],sync_id: @sync[:id])
           #sync.unions.create!(t)
        end
      end
    rescue
      # Handle the exception
    end
  end

暫無
暫無

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

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