你可以手动管理事务提交/回滚吗?

我想要做这样的事情:

["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

简而言之,我有一串'消息',我想交易这部分流。

无论何时在流上出现“开始”,都会开始一个新的事务。 每当出现“停止”时,交易都会被提交。

我正在努力处理交易。

我可以看到,我可以做ActiveRecord :: Base.transaction do ... end,但是在这种情况下不起作用,除非我把所有东西都加起来,这在这里不可能是因为流。

我看到有一个埋在ActiveRecord中的事务管理器,我可以使用(https://github.com/rails/rails/blob/0d76ab9c6f01e6390ba8878a296ff9d3ac6b9aa8/activerecord/lib/active_record/connection_adapters/abstract/transaction.rb),但我没有'我能够让我的测试通过它。

我认为问题的一部分也是RSpec的交易装置干扰,尽管禁用这些似乎也不能解决问题。

任何帮助,将不胜感激。

谢谢


我会这样做:

messages.chunk {|value| value != 'START' && value != 'STOP'}.each do |is_data, bodies|
  if is_data
    Message.transaction do
      bodies.each {|body| Message.create(body: body)}
    end
  end
end

第一步是使用chunk来分组消息。 这是一对数组。 如果这个对的第一个值是真,那么第二个值就是这个体的数组,如果不是,那么这个体就是真的假。 随着数据如此重组,使用现有的交易方法变得微不足道。


您可以通过以下方式管理交易

manager = ActiveRecord::Base.connection.transaction_manager
...
manager.begin_transaction
...
manager.commit_transaction
...
manager.rollback_transaction

或者你的情况

manager = ActiveRecord::Base.connection.transaction_manager
["START", "a", "b", "c", "STOP", "START", "d", "e", "STOP"].each do |message|
  if message == "START"
    manager.begin_transaction
  elsif message == "STOP"
    manager.commit_transaction
  else
    begin
      Message.create!(body: message)
    rescue
      manager.rollback_transaction
    end
  end
end
链接地址: http://www.djcxy.com/p/66233.html

上一篇: Can you manage transaction commit/rollback manually?

下一篇: How to convert this ActiveRecord::Observer to a Service object?