|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
12.03.2018, 09:34 | #1 |
Форумчанин
Регистрация: 02.02.2009
Сообщений: 844
|
Вложенные транзакции
Прошу пояснит не понятные мне моменты.
Начали транзакцию Т1, внутри неё начали транзакцию Т11, завершил Т11. Тут вопрос: должна ли фиксироваться Т11? Если нет, то почему? Предположим мы зафиксировали Т11. Тут началась параллельная транзакция Т2, которая использует результат работы Т11. Начали, завершили, зафиксировали. Тут Т1 отменяться, и как следствие отменяться результат Т11. НО! Т2 уже завершена! Отменить её невозможно, так как она параллельна Т1. Получается все таки фиксировать вложенные транзакции нельзя? Но тогда как быть в этой ситуации. Предположим мы создаем договор с фирмой Лютик в Т1. Но у нас нет ещё этой фирмы в контрагентах. В Т11, мы создали на неё данные, с фиксацией. После чего продолжили формировать договор. В этот момент в другом отделе, так же создают договор с этой же фирмой. Они видят что такой контрагент уже создан, и используют его. То есть по сути Т11 отменять нельзя. Но и не фиксировать Т11 нельзя, так как в этом случае данные на одного контрагента будут созданы дважды, разным отделами. "Кто виноват? И что делать?" (с)
С уважением, Алексей.
Последний раз редактировалось tae1980; 12.03.2018 в 09:48. |
12.03.2018, 10:26 | #2 |
Форумчанин
Регистрация: 02.02.2009
Сообщений: 844
|
Вот нашел цитата "Если внешняя транзакция откатывается, то все внутренние транзакции также будут отменены, независимо от того, были ли отдельные внутренние транзакции зафиксированы."
Значит по сути второй отдел пролете... Что делать со вторым договором? В случае фиксации Т11 и её откатом, он будет ссылаться на несуществующие данные.
С уважением, Алексей.
|
12.03.2018, 10:37 | #3 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Ну вот например для сиквела вложенная транзакция это чистой воды профанация. На самом деле решает все T1 - её откат откатит и все вложенные, не взирая на то, что они как бы и завершены ))
Цитата:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
|
12.03.2018, 11:07 | #4 |
Форумчанин
Регистрация: 02.02.2009
Сообщений: 844
|
А можно привести приемную схему действий для данного случай?
Если я правильно понял теорию, то транзакция это всегда линейный процесс. Если начата транзакция её нельзя временно прекратить и начат другую, все последующие будут вложенными. То есть, из ходя из этого для создания контрагента нужно использовать полностью независимый параллельный процесс. НО: 1. транзакции линейный. Значит нужно создать внешний процесс и ждать его завершения в Т1. 2. Хорошо поступили так. Но тогда есть хорошие шансы появления мусора. Когда Т1 отменяется, результат Т11 как внешнего процесса остается, а Т2 так и не наступает. Пока вижу выход только, в смериться и чистить вручную.
С уважением, Алексей.
|
12.03.2018, 11:56 | #5 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Как вариант выбирать (или создавать контрагента с независимой транзакцией) в предбаннике создания договора, тогда в самом договоре изменить его нельзя. Если договор по каким-то причинам не создался, то удалить контрагента, при условии, что он создан в предбаннике и за это время никто на него не сослался
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
12.03.2018, 12:02 | #6 |
Форумчанин
Регистрация: 02.02.2009
Сообщений: 844
|
А как это определить?
Есть стандартный механизм или только "ручной" анализ?
С уважением, Алексей.
|
12.03.2018, 12:30 | #7 | |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Цитата:
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Последний раз редактировалось Аватар; 12.03.2018 в 12:32. |
|
13.03.2018, 11:53 | #8 |
Пользователь
Регистрация: 11.04.2017
Сообщений: 64
|
1. Не делать длительных транзакций.
2. Немного погуглить про уровни изоляции. 3. Паралельные транзакции будут обязательно - но уже в другом процессе, с другим SPId - и в них либо ждать завершения и коммита первой транзакции - либо надеяться, что "прокатит" - но не "прокатит" оно. |
15.03.2018, 23:15 | #9 |
Форумчанин
Регистрация: 02.02.2009
Сообщений: 844
|
Дурацкий вопрос. Что значит "длинных"? Как считать длину и прочее. В общем я понимаю ответ. НО это то же самое, что и "не используйте сложных алгоритмов, иначе другим программистам будет трудно разобраться вашей программе." А если тот другой программист "даун" и пр? И ему сложно понять что 2+2=4 (утрировано). Где предел простаты?
В описанном в примере случае ИМХО важно организация работы с договорами. Начало работы, нажатие кнопки "Новый договор". И пошла транзакция. Окончание работы/транзакции - подготовка договора, нажатие кнопки сохранить. Ты хоть тресни, но есть четки границы работы с договором. И иногда уходят часы, на подготовку одного договора. Я молчу про подготовку в рамках договора тех.задания, календарного плана, приложений и пр. Это части единого документа. Пока вижу выход только в выводе ВСЕХ спорных моментов в самостоятельные процессы. Читаю уже две недели. С одной стороны материал много, с другой толкового мало. Но нашел 4 интересных статьи. Пытаюсь их курить. Законы Мерфи ни кто не отменял.
С уважением, Алексей.
Последний раз редактировалось tae1980; 15.03.2018 в 23:19. |
16.03.2018, 06:48 | #10 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
Начало транзакции по кнопке Создать или Изменить и есть длительная транзакция. Нормальная транзакция должна начинаться по кнопке Сохранить ))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
транзакции | sem_1989 | SQL, базы данных | 1 | 23.09.2011 22:43 |
транзакции | пауэрлифтинг | БД в Delphi | 0 | 27.05.2010 02:24 |
Транзакции в DLL | acidlord | БД в Delphi | 0 | 28.11.2009 13:31 |
Транзакции и try | nikmay | Общие вопросы Delphi | 1 | 30.07.2009 21:13 |
Транзакции + ADO | azat | БД в Delphi | 3 | 14.01.2008 11:47 |