4

Rails 使用保存点来实现与 MySQL 的嵌套事务,据我了解,就原子数据更改而言,其语义与实际嵌套事务相同。

  1. 这是真的?
  2. 在代码中的任意时间调用“保存”怎么样?交易仍然保持开放,直到区块结束,对吧?使用嵌套事务/保存点时的行为有什么不同吗?
  3. 还有什么需要注意的吗?
  4. 【故意煽动火焰战争】我应该切换到PostgresSQL吗?
4

2 回答 2

4
  1. 是的,这是真的,唯一具有真正嵌套事务的数据库是 MS SQL Server

  2. 是的,即使您在任意时间调用 save,事务也会保持打开状态,但是,如果在嵌套事务中引发回滚异常,则不会导致外部事务的全局回滚(参见 #3 以了解保存点管理)。

  3. 您可以将 Model.transaction(:requires_new => true) 传递给创建子事务,这可能是您所期望的行为,否则您将无法控制嵌套事务,因为它不会服从嵌套回滚。此外,人们有时会忘记模型回调都在 1 个事务中执行,因此回调中的任何事务都是嵌套事务。

  4. 您并没有真正煽动火焰战争,PostgresSQL 也没有嵌套事务(它也使用保存点),它们都是很棒的数据库。

于 2011-03-10T04:47:25.997 回答
1

据我所知,Mysql 的嵌套事务依赖于 MySQL 5+ 中的 Savepoints 功能。如果您是 Rails 2.3.2+ 和 Mysql 5+,它看起来应该可以正常工作。

但是,嵌套事务管理起来可能非常混乱。如果您依靠它来清理您正在做的事情并将工作流程分解为更简单的东西(恕我直言),您可能需要考虑您的设计选择。

于 2011-02-21T19:25:50.913 回答