ActiveRecord, MySQL и вложенные транзакции - каково поведение? - PullRequest
4 голосов
/ 10 февраля 2011

Rails использует точки сохранения для выполнения вложенных транзакций с MySQL, и, насколько я понимаю, семантика этого идентична фактическим вложенным транзакциям с точки зрения атомарных изменений данных.

  1. Это правда?
  2. А как насчет вызова "save" в произвольные моменты времени в коде? Транзакция остается открытой до конца блока, верно? Существуют ли различия в поведении при использовании вложенных транзакций / точек сохранения?
  3. Что еще нужно знать?
  4. [преднамеренно разжигает пламенную войну] Должен ли я перейти на PostgresSQL?

Ответы [ 2 ]

4 голосов
/ 10 марта 2011
  1. Да, это правда, единственная БД с истинно вложенными транзакциями - это MS SQL Server

  2. Да, транзакция остается открытой, даже если вы вызываете save при произвольномОднако, если исключение отката возникает во вложенной транзакции, это не приведет к глобальному откату внешней транзакции (см. также # 3 для управления точкой сохранения).

  3. Выможет передать Model.transaction (: require_new => true) для создания суб-транзакции, это, вероятно, ожидаемое вами поведение, так как в противном случае вы не будете иметь контроль над вложенной транзакцией, поскольку она не будет выполнять вложенные откаты.Кроме того, люди иногда забывают, что все обратные вызовы модели выполняются в одной транзакции, поэтому любая транзакция внутри обратного вызова является вложенной транзакцией.

  4. На самом деле вы не разжигаете пламенную войну, PostgresSQLтакже не имеет вложенных транзакций (он также использует точки сохранения), они обе являются отличными базами данных.

1 голос
/ 21 февраля 2011

Насколько я знаю, вложенные транзакции для Mysql используют функцию Savepoints в MySQL 5+.Похоже, он должен работать правильно, если вы Rails 2.3.2+ и Mysql 5+.

Однако вложенные транзакции могут быть очень грязными для управления.Возможно, вы захотите рассмотреть свой выбор дизайна, если вы полагаетесь на это, чтобы очистить то, что вы делаете, и разложить рабочий процесс на что-то более простое (ИМХО).

...