Реализация транзакций рельсов не использует точек сохранения (или аналогичных технологий), которые используются базами данных для поддержки вложенных транзакций.Истинные вложенные транзакции не поддерживаются самими базами данных.
пример:
begin -- starts transaction 1
begin -- start transaction 2
insert into something (foo) values ('bar');
commit -- ends transaction 1
rollback -- is ignored
Первая commit
или rollback
всегда закрывает исходящую транзакцию.* Есть способ, которым базы данных могут фактически делать вложение.это будет использовать ранее упомянутые точки сохранения .пример
begin -- starts transaction 1
savepoint foo -- starts "transaction" 2
insert into something (foo) values ('bar');
release -- commit for transaction 2
rollback -- roll back the data of the savepoint and everything else within transaction 1
Вы можете вкладывать столько точек сохранения , сколько хотите друг в друга, если транзакция открыта.
Для самих рельсов есть ловушкахотя: функции создают и аналогично оборачиваются внутри транзакции.Итак, ваш первый пример приводит к следующему sql
begin -- transaction.do
begin -- Client.create
insert into clients ( name ) values ('Pavel') -- Client.create
commit -- Client.create, closes the out-most transaction
begin -- transaction.do
begin -- Client.create
insert into clients ( name ) values ('Elena') -- Client.create
commit -- Client.create, closes the out-most transaction
Так что ваше Исключение просто приходит с опозданием.
Вы можете исправить эту проблему, но вы должны сделать это для каждого адаптера подключения.*
PS: Вы можете быть смущены --
в sql.Это однострочные комментарии в mysql ..