您可以手动管理事务 commit/rollback 吗?
Can you manage transaction commit/rollback manually?
我想做这样的事情:
["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
简而言之,我有一个 'messages' 流,我想对该流的一部分进行事务处理。
每当 "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 的事务固定装置干扰,尽管禁用它们似乎也没有解决问题。
如有任何帮助,我们将不胜感激。
谢谢
我会这样做:
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
我想做这样的事情:
["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
简而言之,我有一个 'messages' 流,我想对该流的一部分进行事务处理。
每当 "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 的事务固定装置干扰,尽管禁用它们似乎也没有解决问题。
如有任何帮助,我们将不胜感激。
谢谢
我会这样做:
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