根据文档ActiveRecord :: Transactions ::
ClassMethods
,一个非新的嵌套事务将忽略回滚。从文档:
User.transaction do
User.create(username: 'Kotori')
User.transaction do
User.create(username: 'Nemu')
raise ActiveRecord::Rollback
end
end
该raise ActiveRecord::Rollback
被忽略,因为它是在一个子事务(或者更确切地说,它仍然是在父事务中,而不是自己的)。我不明白为什么两者都会忽略Rollback调用?我可以看到,由于子级’transaction’并不是真正的事务,它不会回滚’Nemu’块,但是为什么它不触发父级的回滚?子事务是否以某种方式隐藏了回滚?
换句话说,为什么似乎没有办法从嵌套子项中回滚父事务?
实际上,这正是 嵌套事务 设计的目的。我引用oracle文档:
嵌套事务用于为较大事务范围内执行的操作的子集提供事务保证。这样做使您可以独立于较大的事务来提交和中止操作的子集。
因此,常规 嵌套事务中 的子事务除了更改相互数据或失败失败外,没有其他关于他或其他孩子或父母( 较大事务 )的行为的发言权。
但是,你可以给他( 子事务 利用)对他命运的一个非常有限的投票机会,sub- transaction
特征为在轨说明文档通过传递requires_new: true
User.transaction do
User.create(username: 'Kotori')
User.transaction(requires_new: true) do
User.create(username: 'Nemu')
raise ActiveRecord::Rollback
end
end
正如文档所说:仅创建“ Kotori”。因为强大的“ Nemu”孩子选择默默地死。
有关 嵌套事务处理规则的 更多详细信息(oracle
docs
)
更新:
为了更好地理解Rails为何如此nested transactions
工作,您需要更多地了解嵌套事务在数据库级别的工作方式,我引用了rails api
docs
:
大多数数据库不支持真正的嵌套事务…为了解决此问题,#transaction将通过使用保存点来模拟嵌套事务的效果:http
://dev.mysql.com/doc/refman/5.0/ zh /
savepoint.html
好的,然后文档描述了nested transaction
上述两种情况下a的行为,如下所示:
如果发生嵌套调用,则#transaction的行为如下:
该块将不执行任何操作。块中发生的所有数据库语句都有效地附加到已经打开的数据库事务中。
但是,如果设置了:requires_new,则该块将被包装在充当子事务的数据库保存点中。
我想 小心,只想想 :
*如果您使用的是完全支持的DBMS, 或者您对以下选项的“假”行为感到满意,则可以使用 *option(1) ( 不带
require_new)nested transactions
:nested_attributes
如果不支持,则 option(2) 支持该savepoint
解决方法。
问题内容: JTA为什么不支持嵌套事务?是因为实现它们的复杂性(我对此表示怀疑)还是某些设计原则? 问题答案: (正如@Piotr Nowicki指出的那样,JTA 确实 允许嵌套事务,但这不是强制性的可选操作。) 为什么?这是无法确定地回答的问题之一,除非您是做出决定时“在房间里”的人之一。 将嵌套事务作为规范的一部分包括在内可能是固有的复杂性。或当时明显的复杂性;即他们不知道他们知道如何做一个
问题内容: 我正在尝试在包级别使用Hibernate @TypeDef批注,这与Hibernate文档中所描述的完全相同。我正在使用和。代码可以编译,并且在类路径中,但是Hibernate仍然看不到它。 如果我上课,那是行得通的,但是如果我把放在那,那是没有用的。我试图用Google搜索,但找不到任何有用的信息。 谢谢! 问题答案: 您可能需要添加一个 到您的Hibernate配置文件,或调用co
问题内容: 我有一个带有关系的实体,我想通过一个查询来检索它,因此使用。有时,Hibernate不尊重它,而是发出N + 1 秒。随着 有时 我的意思是,因为我不知道是什么触发它,我有案件对不同的查询,这可能发生,或者不一样的类。 这是带有我使用的注释的简化实体: 用 我希望单个查询能够同时获取其及其内容,例如 相反,我得到了第一选择所有N S和那么N 献给所有S(考虑没有缓存)。 我发现了许多类
我对iOS布局约束的机制有误解。请参阅下面列出的我放在viewDidLoad中的代码。 在我看来,我的意图是明确的。我想在设备屏幕的中央看到一个按钮。但我只能看到下面的图片。 我在项目控制台中有一个输出,非常可怕,我无法从中理解任何东西。 无法同时满足约束。可能以下列表中至少有一个约束是您不想要的。尝试以下方法:(1)查看每个约束,并尝试找出您不期望的约束;(2) 查找添加了一个或多个不需要的约束
情景故事时间: 我“继承”了一个程序,一个用于访问数据库的相当简单的webservice。该程序在某个地方有一个缺陷:它试图更新一个没有更新授权的表。该程序只具有更新数据库队列的权限(Oracle),以保存谁访问了什么信息。这是不受欢迎的行为,现在我纠正了它。注意:这与这个问题本身无关,它只是导致我提出这个问题的原因。 该程序使用Spring+Hibernate来管理和访问数据和事务。 因为程序的
问题内容: 我将Spring 3.1.3用于Web应用程序,将XML配置与组件扫描结合使用。 我意识到,其中一个扫描组件必须在其他几个组件之前进行初始化。在所有需要构造后初始化的类上,我在方法上具有@PostConstruct批注。 为了设置依赖关系顺序,我在需要先后构造的类上将“ @Component”更改为“ @Component(“ configData”)”。然后,在每个需要在“ conf