数据库
首页 > 数据库> > mysql-您可以手动管理事务提交/回退吗?

mysql-您可以手动管理事务提交/回退吗?

作者:互联网

我想做这样的事情:

["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 … …结束,但是在这种情况下,除非我将所有内容进行批处理,否则这将无法工作,由于流的原因,这里是不可能的.

我看到有一个事务记录管理器埋在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对消息进行分组.其输出是成对的数组.如果该对的第一个值是true,则第二个值是主体数组,如果不是,则这些主体只是true false.如此重组了数据之后,使用现有的交易方法就变得微不足道了.

标签:activerecord,transactions,ruby-on-rails,mysql
来源: https://codeday.me/bug/20191120/2044262.html