Rails 4 ActiveRecord 事务块 - 回滚条件
Rails 4 ActiveRecord Transaction Block - Rollback criteria
您好,我正在使用 ActiveRecords Transaction 块来制作一堆记录,要么全部被接受,要么 none。
我在我的模型中包含了事务块,并从控制器调用了整个函数:
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 guide 开始,在事务块中使用 create 方法是有效的,但我也尝试过在数组上调用 @sync.new
和 unions.new
然后只放置@sync.save!
等在事务块内也没有太大成功。
我认为这可能是因为联合创建过程没有明确的 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 (, , , ) 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
您好,我正在使用 ActiveRecords Transaction 块来制作一堆记录,要么全部被接受,要么 none。 我在我的模型中包含了事务块,并从控制器调用了整个函数:
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 guide 开始,在事务块中使用 create 方法是有效的,但我也尝试过在数组上调用 @sync.new
和 unions.new
然后只放置@sync.save!
等在事务块内也没有太大成功。
我认为这可能是因为联合创建过程没有明确的 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 (, , , ) 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