Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.03.2018, 09:34   #1
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию Вложенные транзакции

Прошу пояснит не понятные мне моменты.
Начали транзакцию Т1, внутри неё начали транзакцию Т11, завершил Т11. Тут вопрос: должна ли фиксироваться Т11? Если нет, то почему? Предположим мы зафиксировали Т11.
Тут началась параллельная транзакция Т2, которая использует результат работы Т11. Начали, завершили, зафиксировали.
Тут Т1 отменяться, и как следствие отменяться результат Т11. НО! Т2 уже завершена! Отменить её невозможно, так как она параллельна Т1.

Получается все таки фиксировать вложенные транзакции нельзя?

Но тогда как быть в этой ситуации. Предположим мы создаем договор с фирмой Лютик в Т1. Но у нас нет ещё этой фирмы в контрагентах. В Т11, мы создали на неё данные, с фиксацией. После чего продолжили формировать договор. В этот момент в другом отделе, так же создают договор с этой же фирмой. Они видят что такой контрагент уже создан, и используют его.
То есть по сути Т11 отменять нельзя. Но и не фиксировать Т11 нельзя, так как в этом случае данные на одного контрагента будут созданы дважды, разным отделами.

"Кто виноват? И что делать?" (с)
С уважением, Алексей.

Последний раз редактировалось tae1980; 12.03.2018 в 09:48.
tae1980 вне форума Ответить с цитированием
Старый 12.03.2018, 10:26   #2
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Вот нашел цитата "Если внешняя транзакция откатывается, то все внутренние транзакции также будут отменены, независимо от того, были ли отдельные внутренние транзакции зафиксированы."
Значит по сути второй отдел пролете... Что делать со вторым договором? В случае фиксации Т11 и её откатом, он будет ссылаться на несуществующие данные.
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 12.03.2018, 10:37   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Ну вот например для сиквела вложенная транзакция это чистой воды профанация. На самом деле решает все T1 - её откат откатит и все вложенные, не взирая на то, что они как бы и завершены ))
Цитата:
Что делать со вторым договором?
Не делать вложенных транзакций, они не для этого
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.03.2018, 11:07   #4
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Не делать вложенных транзакций, они не для этого
А можно привести приемную схему действий для данного случай?
Если я правильно понял теорию, то транзакция это всегда линейный процесс. Если начата транзакция её нельзя временно прекратить и начат другую, все последующие будут вложенными.
То есть, из ходя из этого для создания контрагента нужно использовать полностью независимый параллельный процесс. НО:
1. транзакции линейный. Значит нужно создать внешний процесс и ждать его завершения в Т1.
2. Хорошо поступили так. Но тогда есть хорошие шансы появления мусора. Когда Т1 отменяется, результат Т11 как внешнего процесса остается, а Т2 так и не наступает. Пока вижу выход только, в смериться и чистить вручную.
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 12.03.2018, 11:56   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Как вариант выбирать (или создавать контрагента с независимой транзакцией) в предбаннике создания договора, тогда в самом договоре изменить его нельзя. Если договор по каким-то причинам не создался, то удалить контрагента, при условии, что он создан в предбаннике и за это время никто на него не сослался
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 12.03.2018, 12:02   #6
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
и за это время никто на него не сослался
А как это определить?
Есть стандартный механизм или только "ручной" анализ?
С уважением, Алексей.
tae1980 вне форума Ответить с цитированием
Старый 12.03.2018, 12:30   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
А как это определить?
Можно запросом проверить, можно в триггере на удаление не дать удалить в случае наличия присутствия, можно просто понадеяться на СУБД, которая не даст порушить ссылочную целостность если у договора контрагент внешняя ссылка))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 12.03.2018 в 12:32.
Аватар вне форума Ответить с цитированием
Старый 13.03.2018, 11:53   #8
hoolygan
Пользователь
 
Регистрация: 11.04.2017
Сообщений: 64
По умолчанию

1. Не делать длительных транзакций.
2. Немного погуглить про уровни изоляции.
3. Паралельные транзакции будут обязательно - но уже в другом процессе, с другим SPId - и в них либо ждать завершения и коммита первой транзакции - либо надеяться, что "прокатит" - но не "прокатит" оно.
hoolygan вне форума Ответить с цитированием
Старый 15.03.2018, 23:15   #9
tae1980
Форумчанин
 
Регистрация: 02.02.2009
Сообщений: 842
По умолчанию

Цитата:
Сообщение от hoolygan Посмотреть сообщение
1. Не делать длительных транзакций.
Дурацкий вопрос. Что значит "длинных"? Как считать длину и прочее. В общем я понимаю ответ. НО это то же самое, что и "не используйте сложных алгоритмов, иначе другим программистам будет трудно разобраться вашей программе." А если тот другой программист "даун" и пр? И ему сложно понять что 2+2=4 (утрировано). Где предел простаты?
В описанном в примере случае ИМХО важно организация работы с договорами.
Начало работы, нажатие кнопки "Новый договор". И пошла транзакция. Окончание работы/транзакции - подготовка договора, нажатие кнопки сохранить.
Ты хоть тресни, но есть четки границы работы с договором. И иногда уходят часы, на подготовку одного договора. Я молчу про подготовку в рамках договора тех.задания, календарного плана, приложений и пр. Это части единого документа.
Пока вижу выход только в выводе ВСЕХ спорных моментов в самостоятельные процессы.

Цитата:
Сообщение от hoolygan Посмотреть сообщение
2. Немного погуглить про уровни изоляции.
Читаю уже две недели. С одной стороны материал много, с другой толкового мало. Но нашел 4 интересных статьи. Пытаюсь их курить.

Цитата:
Сообщение от hoolygan Посмотреть сообщение
3. Паралельные транзакции будут обязательно - но уже в другом процессе, с другим SPId - и в них либо ждать завершения и коммита первой транзакции - либо надеяться, что "прокатит" - но не "прокатит" оно.
Законы Мерфи ни кто не отменял.
С уважением, Алексей.

Последний раз редактировалось tae1980; 15.03.2018 в 23:19.
tae1980 вне форума Ответить с цитированием
Старый 16.03.2018, 06:48   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Начало транзакции по кнопке Создать или Изменить и есть длительная транзакция. Нормальная транзакция должна начинаться по кнопке Сохранить ))
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
транзакции 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