gpt4 book ai didi

ruby-on-rails - 如何在 ActiveRecord 中为 INSERT ONLY 语句跳过事务?

转载 作者:行者123 更新时间:2023-12-03 23:43:58 24 4
gpt4 key购买 nike

看这个例子:

2.1.3 :001 > Stat.create!
(0.1ms) BEGIN
SQL (0.3ms) INSERT INTO `stats` (`created_at`, `updated_at`) VALUES ('2015-03-16 11:20:08', '2015-03-16 11:20:08')
(0.4ms) COMMIT
=> #<Stat id: 1, uid: nil, country: nil, city: nil, created_at: "2015-03-16 11:20:08", updated_at: "2015-03-16 11:20:08">

如您所见 create!方法在无用事务中执行插入语句。如何仅在这种情况下禁用转换(而不在整个应用程序中禁用它们)?

最佳答案

这里的问题是您想要修改类级别方法的行为。这本质上不是线程安全的,至少对于其他 Stat 对象的并发事务。一个简单的解决方法是将实例标记为不需要事务:

class Stat < ActiveRecord::Base
attr_accessor :skip_transaction

def with_transaction_returning_status
if skip_transaction
yield
else
super
end
end
end

Stat.create! skip_transaction: true

如果您在单线程框架上运行,因此不关心在此期间暂停 Stat 对象的事务,您可以使用类级别的方法并像这样包装调用:
class Stat < ActiveRecord::Base
def self.transaction(*args)
if @skip_transaction
yield
else
super
end
end

def self.skip_transaction
begin
@skip_transaction = true
yield
ensure
@skip_transaction = nil
end
end
end

Stat.skip_transaction { Stat.create! }

关于ruby-on-rails - 如何在 ActiveRecord 中为 INSERT ONLY 语句跳过事务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29075767/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com