【发布时间】:2015-06-23 06:03:51
【问题描述】:
我想做这样的事情:
["START", "a", "b", "c", "STOP", "START", "d", "e", "STOP"].each do |message|
if message == "START"
Transaction.begin
elsif message == "STOP"
Transaction.commit if Transaction.active?
else
begin
Message.create!(body: message)
rescue
Transaction.rollback
end
end
end
简而言之,我有一个“消息”流,我想对该流的部分进行事务处理。
只要流中出现“START”,就会开始新事务。每当出现“STOP”时,事务就被提交。
我正在为交易而苦苦挣扎。
我可以看到我可以执行 ActiveRecord::Base.transaction do ... end,但在这种情况下这将不起作用,除非我将所有内容都批量处理,这在此处是不可能的,因为流。
我看到 ActiveRecord 中隐藏了一个事务管理器,我可能会使用它 (https://github.com/rails/rails/blob/0d76ab9c6f01e6390ba8878a296ff9d3ac6b9aa8/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb),但我无法让我的测试通过它。
我认为问题的一部分也是 RSpec 的事务性装置干扰,尽管禁用这些似乎也不能解决问题。
任何帮助将不胜感激。
谢谢
【问题讨论】:
-
你能提供更多数据吗?你在挣扎什么?也许显示失败的规格。
标签: mysql ruby-on-rails activerecord transactions