gpt4 book ai didi

ruby-on-rails - Rails 3. 嵌套事务。子 block 中的异常

转载 作者:行者123 更新时间:2023-12-03 17:05:26 24 4
gpt4 key购买 nike

为什么在子 block 中出现异常后 ActiveRecord 不回滚嵌套事务中的更改?

例子如下:

1.


>> Client.transaction do
?> Client.create(:name => 'Pavel')
>> Client.transaction do
?> Client.create(:name => 'Elena')
>> raise ActiveRecord::Rollback
>> end
>> end
=> nil
>> Client.all.map(&:name)
=> ["Pavel", "Elena"] # instead of []

2.


>> Client.transaction do
?> Client.create(:name => 'Pavel')
>> Client.transaction(:requires_new => true) do
?> Client.create(:name => 'Elena')
>> raise ActiveRecord::Rollback
>> end
>> end
=> nil
>> Client.all.map(&:name)
=> ["Pavel", "Elena"] # instead of ["Pavel"]

谢谢。

Debian GNU/Linux 5.0.6;

ruby 1.9.2;

Ruby on Rails 3.0.1;

SQLite 3.7.3。

最佳答案

我遇到了同样的问题,我可以完全复制你的结果。如果我在外部 block 中引发 ActiveRecord::Rollback,则整个事务回滚,否则,不会回滚任何内容。

显然,当前版本的 ActiveRecord 不知道如何使用 SQLite3 进行嵌套事务,尽管 ActiveRecord 应该使用保存点实现嵌套事务,并且 SQLite 从 3.6.8 开始支持保存点。

作为 ActiveRecord 尚不支持的进一步证据,试试这个...

> List.connection.supports_savepoints?
=> false

Ubuntu 11.04 - Natty Narwhal;

ruby 1.8.7 (2010-04-19 patchlevel 253) [i486-linux], MBARI 0x8770, Ruby Enterprise Edition 2010.02;

Ruby on Rails 3.0.3;

sqlite3 gem 1.3.3

SQLite 3.7.2;

关于ruby-on-rails - Rails 3. 嵌套事务。子 block 中的异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4153719/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com