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