Регистрация  |  Вход

В try-catch нет отката DML операций в try секции?!!

Был уверен, что хорошо понимаю порядок и логику работы try-catch.

Ан нет, вот только что неприятно удивилсё!

есть try-catch.

в трае есть один инсерт, а за ним второй инсерт с дочерними записями, которые между инсертами успевают получить родительное айди в нужное поле.

затем отрправка письма счастья

а в catchе отравляется письмо несчастья.

так вот я был уверен, что если второй инсерт не пройдет и код уйдет на кетч, то первый инсерт "само-выпилится" (все операции трая полностью "откатятся").

а вот и нет - вижу письмо об ошибке и то же время в Орге запись первого инсерта.

я прям напуган. это чтож на каждый инсерт нужно делать свой трай-кетч...

Был уверен, что хорошо понимаю порядок и логику работы try-catch.

Ан нет, вот только что неприятно удивилсё!

есть try-catch.

в трае есть один инсерт, а за ним второй инсерт с дочерними записями, которые между инсертами успевают получить родительное айди в нужное поле.

затем отрправка письма счастья

а в catchе отравляется письмо несчастья.

так вот я был уверен, что если второй инсерт не пройдет и код уйдет на кетч, то первый инсерт "само-выпилится" (все операции трая полностью "откатятся").

а вот и нет - вижу письмо об ошибке и то же время в Орге запись первого инсерта.

я прям напуган. это чтож на каждый инсерт нужно делать свой трай-кетч...

Den Brown
Был уверен, что хорошо понимаю порядок и логику работы try-catch.

Ан нет, вот только что неприятно удивилсё!

есть try-catch.

в трае есть один инсерт, а за ним второй инсерт с дочерними записями, которые между инсертами успевают получить родительное айди в нужное поле.

затем отрправка письма счастья

а в catchе отравляется письмо несчастья.

так вот я был уверен, что если второй инсерт не пройдет и код уйдет на кетч, то первый инсерт "само-выпилится" (все операции трая полностью "откатятся").

а вот и нет - вижу письмо об ошибке и то же время в Орге запись первого инсерта.

я прям напуган. это чтож на каждый инсерт нужно делать свой трай-кетч...

А что тебя смущает?

[quote="Den Brown"]Был уверен, что хорошо понимаю порядок и логику работы try-catch.

Ан нет, вот только что неприятно удивилсё!

есть try-catch.

в трае есть один инсерт, а за ним второй инсерт с дочерними записями, которые между инсертами успевают получить родительное айди в нужное поле.

затем отрправка письма счастья

а в catchе отравляется письмо несчастья.

так вот я был уверен, что если второй инсерт не пройдет и код уйдет на кетч, то первый инсерт "само-выпилится" (все операции трая полностью "откатятся").

а вот и нет - вижу письмо об ошибке и то же время в Орге запись первого инсерта.

я прям напуган. это чтож на каждый инсерт нужно делать свой трай-кетч...[/quote]

А что тебя смущает?

wilder
А что тебя смущает?

я думал, что Трай секция работает по принципу "все или ничего", т.е. при уходе в Кетч с любой строки Трая все содержимое Трая откатывается к изначальному состоянию...

[quote="wilder"]А что тебя смущает?[/quote]

я думал, что Трай секция работает по принципу "все или ничего", т.е. при уходе в Кетч с любой строки Трая все содержимое Трая откатывается к изначальному состоянию...

А чего оно будет откатываться. Откатывается глобальная транзакция если падает вся страница. Если страница выполнилась, независимо от того что у тебя произошло в try блоке, все изменения сохранятся.
Если хочешь, можешь сам создавать транзакции вручную:
перед try - Savepoint sp = Database.setSavepoint();
в catch - Database.rollback(sp);
но там есть какие-то проблемы. Помню сталкивался. Вроде нельзя что-то после Savepoint sp = Database.setSavepoint(); делать. Callouts наверное? Надо уточнять.

вот на эту тему Transaction Control

А чего оно будет откатываться. Откатывается глобальная транзакция если падает вся страница. Если страница выполнилась, независимо от того что у тебя произошло в try блоке, все изменения сохранятся. 
Если хочешь, можешь сам создавать транзакции вручную:
перед try - Savepoint sp = Database.setSavepoint();
в catch - Database.rollback(sp);
но там есть какие-то проблемы. Помню сталкивался. Вроде нельзя что-то после Savepoint sp = Database.setSavepoint(); делать. Callouts наверное? Надо уточнять.

вот на эту тему [url=https://www.salesforce.com/us/developer/docs/apexcode/Content/langCon_apex_transaction_control.htm]Transaction Control[/url]