powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как правильно открывать и закрывать транзакции базы данных из С# Framework.
28 сообщений из 28, показаны все 2 страниц
Как правильно открывать и закрывать транзакции базы данных из С# Framework.
    #38580624
Ay-y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это скорее вопрос стиля и дизайна, но хочется послушать разные мнения о том как правильно вводить данные в базу.
Распространённая ситуция.
Надо ввести данные в SQL Server базу предположим по такому сценарию.
1. Ввести И.Ф.О. человека в тавлицу User и получить его ID из этой таблицы.
2. Использовать это ID при вставлении данных в таблицу Address.
Если по какой-то причине данные в Address не вставились, то данные из таблицы User тоже должны быть убраны.
Понятно что в данном случае можно написать одну strored procedure и забыть.
Но существуют гораздо более сложные ситуации, когда лучше использовать несколько процедур, или производить какую-то бизнесс логику в бизнесс уровне, а не в базе данных.
Как это делать правильно?
И вообще кто как это делает?
...
Рейтинг: 0 / 0
Как правильно открывать и закрывать транзакции базы данных из С# Framework.
    #38580656
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Ay-y,

Все в единой транзакции в хранимой процедуре

Ay-yНо существуют гораздо более сложные ситуации, когда лучше использовать несколько процедур
Вызвать все эти ХП из другой ХП
...
Рейтинг: 0 / 0
Как правильно открывать и закрывать транзакции базы данных из С# Framework.
    #38580669
Ay-y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2,

Это то как мы сейчас делаем. По рабоче-крестьянски.
Просто тут кругом пишут что бизнесс логика должна находиться в бизнесс слое. Что в общем-то хорошо и наверно правильно, но мне лично непонятно как это организовать.
А самое главное, какие за и против за такую архитектуру.
Когда всё в ХП - всё просто, понятно и железобетонно.
А вот если надо ХП в разных базах запустить но чтоб если в одной ошибка изменения в другой - rollback.
...
Рейтинг: 0 / 0
Как правильно открывать и закрывать транзакции базы данных из С# Framework.
    #38580680
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ay-yразных базах запустить но чтоб если в одной ошибка изменения в другой - rollback
распределённые транзакции никто не отменял
...
Рейтинг: 0 / 0
Как правильно открывать и закрывать транзакции базы данных из С# Framework.
    #38580758
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Ay-yПросто тут кругом пишут что бизнесс логика должна находиться в бизнесс слое.
Миллионы лемммингов не могут ошибаться
...
Рейтинг: 0 / 0
Как правильно открывать и закрывать транзакции базы данных из С# Framework.
    #38581493
Ay-y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2,
Ну я думаю, что я тоже могу ошибаться.
Хорошо иногда посмотреть на собственные привычки, может пора менять чего.
Жысть меняется, интересно-же знать чего нового-хорошего в мире, а то так-бы и лабали на Паскале илу Вижуал Басике 6.
...
Рейтинг: 0 / 0
Как правильно открывать и закрывать транзакции базы данных из С# Framework.
    #38581591
MsSql_Study
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ay-y,

Вот тут рассмотрен очень интересный вариант
http://habrahabr.ru/post/31632/

Предлагается уйти от стандартного подхода, когда ключ - Integer.
Предлагается использовать GUID'ы для всех уникальных ключей. В статье доказывается куча преимуществ.

Как я понимаю, минус лишь в объеме памяти (сколько там байт занимает Гуид ?), но не думаю, что эта проблема критичная, в наше то время терабайтных флешек и дискет.

В частности решается и ваша проблема "записать в таблицу, чтобы узнать ID, который будет сгенерирован". Guid по определению уникален :)

Там еще и другие бонусы описаны


Сам подумываю, не применить ли этот подход. Рабочие проекты переделывать уже не буду, а вот в новом проекте, можно попробовать.

PS. Там в коментариях пишут, что в Windows на системном уровне при генерации GUID ставится какая-то задержка. Не знаю правда ли это. Нужно проверить, запустив генерацию миллиона гуидов и посмотреть время. Если задержки на системном уровне нет, то все должно пройти за секунду.
...
Рейтинг: 0 / 0
Как правильно открывать и закрывать транзакции базы данных из С# Framework.
    #38581638
Фотография buser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MsSql_Study
Вы только еще про sequental guid'ы почитайте и, знаете, guid'ы, как это ни печально, не столь уж и уникальны :) ... ну а вообще... просто, не как библию, а для общего развития, пролистайте http://www.ozon.ru/context/detail/id/2628672/
Только все то, что там написано очень близко к сердцу не принимайте :) ну и на id ots не обращайте внимания... метр порой перегибал... :)
...
Рейтинг: 0 / 0
Как правильно открывать и закрывать транзакции базы данных из С# Framework.
    #38581654
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Ay-yа то так-бы и лабали на Паскале илу Вижуал Басике 6.
Да хоть на чем лабай, если бизнес логика в базе
...
Рейтинг: 0 / 0
Как правильно открывать и закрывать транзакции базы данных из С# Framework.
    #38581660
Фотография Cat2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
MsSql_StudyПредлагается уйти от стандартного подхода, когда ключ - Integer.
Предлагается использовать GUID'ы для всех уникальных ключей. В статье доказывается куча преимуществ.
MsSql_Study. Увидели знакомое слово и решили поделится открытием что гуиды лучше чисел?
Вы вообще понимаетен о чем в этом топике разговор?


Ay-yЖысть меняется, интересно-же знать чего нового-хорошего в мире, а то так-бы и лабали на Паскале илу Вижуал Басике 6.
Да все тоже самое. Разработчики баз придумали, как убивать зависшие на клиенте транзакции.
Теперь можно прямо в коде клиента открыть транзакцию, сделать действия, и закрыть ее. Исчезла страшилка, что бухгалтер начал транзакцию и ушел в отпуск. Современные базы такие транзакции откатывают через разумное время. Длительность "разумного времени" разработчиками не раскрывается.

Только вот если бизнес-логика в базе, то не важно на чем к ней писать клиента.
Трехзвенку используют те, кто не умеет писать хранимые процедуры и тригеры
...
Рейтинг: 0 / 0
Как правильно открывать и закрывать транзакции базы данных из С# Framework.
    #38581703
Фотография Диез
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ay-y,

Про TransactionScope читали?

msdn.microsoft.com/en-us/library/system.transactions.transactionscope(v=vs.110).aspx
...
Рейтинг: 0 / 0
Как правильно открывать и закрывать транзакции базы данных из С# Framework.
    #38581878
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ay-yправильно вводить данные в базу.Способов много и все они правильные.
...
Рейтинг: 0 / 0
Как правильно открывать и закрывать транзакции базы данных из С# Framework.
    #38582432
Ay-y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2,
Хочется убрать бизнесс логику из базы, ну или скорее так, разнести бизнесс логику. Что-то загнать в базу, а что-то оставить в бизнесс уровне.
Вот вам ёщё упрощённый пример.
Чтобы быть в контексте с предидущим примером...
Нанимается бригада людей. Надо записать бригаду, и всех её членов в базу, если один из членов не вставился, всё отработать назад и не создавать бригаду в базе.
Можно вызывать процедуры одну из другой, это понятно.
Можно загнать массив данных как XML и уже в процедуре их перелопачивать, это тоже понятно.
Можно, как уже тут сказали, использовать TransactionScope, вот тут уже инересно, кто-то иаспользовал? Какие плюсы и минусы? Мне лично не нравится что его нельзя унаследовать или сделать частью другой транзакции.
Ещё варианты есть?
...
Рейтинг: 0 / 0
Как правильно открывать и закрывать транзакции базы данных из С# Framework.
    #38582445
UInt64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ay-yCat2,
Хочется убрать бизнесс логику из базы, ну или скорее так, разнести бизнесс логику. Что-то загнать в базу, а что-то оставить в бизнесс уровне.
Вот вам ёщё упрощённый пример.
Чтобы быть в контексте с предидущим примером...
Нанимается бригада людей. Надо записать бригаду, и всех её членов в базу, если один из членов не вставился, всё отработать назад и не создавать бригаду в базе.
Можно вызывать процедуры одну из другой, это понятно.
Можно загнать массив данных как XML и уже в процедуре их перелопачивать, это тоже понятно.
Можно, как уже тут сказали, использовать TransactionScope, вот тут уже инересно, кто-то иаспользовал? Какие плюсы и минусы? Мне лично не нравится что его нельзя унаследовать или сделать частью другой транзакции.
Ещё варианты есть?
Есть.
1. Завязывайте с курением.
2. Научитесь грамотно писать по-русски.
3. Забудьте про XML, TransactionScope, массив данных и вызов процедуры из процедуры.
...
Рейтинг: 0 / 0
Как правильно открывать и закрывать транзакции базы данных из С# Framework.
    #38582495
Ay-y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UInt64Ay-yCat2,
Хочется убрать бизнесс логику из базы, ну или скорее так, разнести бизнесс логику. Что-то загнать в базу, а что-то оставить в бизнесс уровне.
Вот вам ёщё упрощённый пример.
Чтобы быть в контексте с предидущим примером...
Нанимается бригада людей. Надо записать бригаду, и всех её членов в базу, если один из членов не вставился, всё отработать назад и не создавать бригаду в базе.
Можно вызывать процедуры одну из другой, это понятно.
Можно загнать массив данных как XML и уже в процедуре их перелопачивать, это тоже понятно.
Можно, как уже тут сказали, использовать TransactionScope, вот тут уже инересно, кто-то иаспользовал? Какие плюсы и минусы? Мне лично не нравится что его нельзя унаследовать или сделать частью другой транзакции.
Ещё варианты есть?
Есть.
1. Завязывайте с курением.
2. Научитесь грамотно писать по-русски.
3. Забудьте про XML, TransactionScope, массив данных и вызов процедуры из процедуры.
А по существу вопроса сказать чего есть?
...
Рейтинг: 0 / 0
Как правильно открывать и закрывать транзакции базы данных из С# Framework.
    #38582689
Кифирчик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ay-y...использовать TransactionScope...
Как-то был случай, заказчик стал жаловаться, что перестало взаимодействие двух систем работать. Причем снаружи все гладко, ни одна из взаимодействующих систем ошибок не выдает. Долго не могли понять причины, в процессе "танцев с бубнами" в логах windows нашли периодически появляющуюся ошибку связанную с распределенной транзакцией. По итогам расследования, оказалось: БД перенесли на Win Server 2008, а компонент в котором создавалась распределенная транзакция работал на 2003 (или 2000, точно не помню), и собственно 2008 "не принимал" в эту транзакцию, от чего она откатывалась. С портами файрвола еще что-то было. Админ заказчика вопрос решил обновлением Windows.
Перед тем как использовать распределенную транзакцию, хорошо присмотрелся бы к "среде" где будет это все работать.

По поводу вызовов ХП в разных базах.
Видел варианты когда один MS SQL работает с ХП и удаленными запросами другого. "В поле" часто глючит, и не показалось "надежным" вариантом (хотя связано скорей всего с локальной сетью).
Возможно, в подобном варианте лучше открывать транзакции в двух базах в коде клиента/апп сервера? Если что-то не вставилось в одну базу, то это возможно отловить кодом и в другой также откатить.

GUID vs ID
В виду использования репликации, везде используем GUID, первое сильно время плевался, сейчас видится, что как минимум ничем не хуже целочисленного ID, в большей степени вопрос привычки. Да и явно удобнее при "переносе" и слиянии данных.
...
Рейтинг: 0 / 0
Как правильно открывать и закрывать транзакции базы данных из С# Framework.
    #38583158
Ay-y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кифирчик,

Мы тоже используем репликации, поэтому у нас конечно GUID, но сейчас работают над совмещением всех баз в одну (и это правильно), но вот мне лично GUID не нравится, хочется от него избавиться совсем. Конечно эти проблемы будет решать DBA, но разработчиков тоже коснётся.
...
Рейтинг: 0 / 0
Как правильно открывать и закрывать транзакции базы данных из С# Framework.
    #38583554
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cat2...Трехзвенку используют те, кто не умеет писать хранимые процедуры и тригеры Оппаньки... Весьма сильное заявление.
А так-то мужики и не знают...
Ну теперь им глазки-то приоткрыли...
...
Рейтинг: 0 / 0
Как правильно открывать и закрывать транзакции базы данных из С# Framework.
    #38583656
UInt64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ay-yUInt64пропущено...

Есть.
1. Завязывайте с курением.
2. Научитесь грамотно писать по-русски.
3. Забудьте про XML, TransactionScope, массив данных и вызов процедуры из процедуры.
А по существу вопроса сказать чего есть?
Я отвечал вам именно по существу, если вы не поняли.
Достаточно было прочесть ваш первый пост в этой ветке (ну и посмотреть статистику ваших сообщений в Просто Трёп), чтобы понять, что вы - ни разу не разработчик.
...
Рейтинг: 0 / 0
Как правильно открывать и закрывать транзакции базы данных из С# Framework.
    #38585436
Ay-y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UInt64,
Ну не знаете, так не знаете, ничего страшного в этом нет.
Я вот тоже не знаю, только спрашивать не стесняюсь.
...
Рейтинг: 0 / 0
Как правильно открывать и закрывать транзакции базы данных из С# Framework.
    #38585438
Ay-y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex KuznetsovCat2...Трехзвенку используют те, кто не умеет писать хранимые процедуры и тригеры Оппаньки... Весьма сильное заявление.
А так-то мужики и не знают...
Ну теперь им глазки-то приоткрыли...
А что используют знающие мужики?
...
Рейтинг: 0 / 0
Как правильно открывать и закрывать транзакции базы данных из С# Framework.
    #38586239
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ay-yAlex Kuznetsovпропущено...
Оппаньки... Весьма сильное заявление.
А так-то мужики и не знают...
Ну теперь им глазки-то приоткрыли...
А что используют знающие мужики?А знающие мужики действуют в зависимости от задач проекта и архитектуры решения.
И соответственно в необходимых случаях используют либо клиент/серверную архитектуру, либо N-звенную.

Обычно бизнес логику выносят в "средний" слой в крупных проектах, работа которых не должна зависеть от конкретной реализации того или иного диалекта работы с БД, а будет использовать в основном ANSI SQL, т.е. то, что должно поддерживаться как минимум всеми поставщиками БД. Естественно, что в таком случае происходит отказ от использования хранимых процедур и триггеров, т.к. при переходе на другую БД пришлось-бы переписывать много кода...

Относительно Вашего вопроса:
Отказаться от использования DataAware компонентов. "Собирать" информацию в памяти, затем выполнить "быструю" транзакцию, состоящую из вставки данных в различные таблицы. И зафиксировать её в случае успешности или откатить в случае ошибки... Открывать транзакцию лучше перед работой с таблицами, закрывать/откатывать сразу по завершении.
Можно даже на основе собранной информации сгенерировать SQL скрипт и выполнить его "одним махом".
...
Рейтинг: 0 / 0
Как правильно открывать и закрывать транзакции базы данных из С# Framework.
    #38586405
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex KuznetsovОтказаться от использования DataAware компонентов. "Собирать" информацию в памяти, затем выполнить "быструю" транзакцию, состоящую из вставки данных в различные таблицы. И зафиксировать её в случае успешности или откатить в случае ошибки... Открывать транзакцию лучше перед работой с таблицами, закрывать/откатывать сразу по завершении.
Можно даже на основе собранной информации сгенерировать SQL скрипт и выполнить его "одним махом".
+1
Среди основных требований к транзакции имеется и её короткое время жизни.

Cat2Трехзвенку используют те, кто не умеет писать хранимые процедуры и тригеры
Точно. Или те, которым скорости СУБД не хватает.
...
Рейтинг: 0 / 0
Как правильно открывать и закрывать транзакции базы данных из С# Framework.
    #38586549
Ay-y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Kuznetsov,
Спасибо.
Где моьно почитать и посмотреть хорошие примеры?
...
Рейтинг: 0 / 0
Как правильно открывать и закрывать транзакции базы данных из С# Framework.
    #38587103
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ay-yAlex Kuznetsov,
Спасибо.
Где моьно почитать и посмотреть хорошие примеры?Попытайтесь найти книги по архитектуре крупных решений, таких, как например SAP, MS Dynamix AX, 1С 8.2 и т.д.
В общем-то правило одно, транзакция должна быть как можно короче по времени, т.е. открыл транзакцию, тут-же изменил данные и сразу закрыл транзакцию. Дело в том, что в сложных, высоко нагруженных системах, необходимо стремиться к снижению нагрузки на базу данных, соответственно предпочтительней не выносить бизнес логику на уровень БД дабы не нагружать излишне сервер БД неспецифичной для него работой.

В малых системах, там где применение среднего слоя нецелесообразно в силу решаемых задач, вынесение бизнес логики на уровень базы данных будет достаточно хорошим решением, т.к. позволит разделить бизнес логику работы с данными от их представления, и соответственно снизить затраты на разработку и сопровождение как отдельных компонентов системы, так и всех системы в целом.

У меня был поучительный опыт работы с Oracle E-Business Suite, в ходе которой я увидел как не стоит разрабатывать сложные ERP системы. Связано это с тем, что изначально на архитектурном уровне в OEBS позволено размещать бизнес логику как на клиентском уровне, т.е. представление данных(Oracle Forms), так и на среднем уровне, плюс в добавок на уровне БД, в виде тех-же хранимых процедур, функций и триггеров. И вот представьте, что есть бизнес процесс, логика которого "размазана" по всем этим уровням. И нужно его доработать либо изменить. Сответственно нужно проанализировать в каком именно месте нужно будет вносить изменения/дополнения, ну а затем собственно их внести. Теперь представьте, что по какой-то причине оказалось, что часть изменений придётся сделать на уровне представления (ну например добавить какие-то вычисления), а часть на уровне хранимых процедур и триггеров(мало-ли). Соответственно вместо того, чтобы сделать доработку в одном месте (на среднем уровне) придется её делать в трёх разных местах...
...
Рейтинг: 0 / 0
Как правильно открывать и закрывать транзакции базы данных из С# Framework.
    #38588462
Ay-y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Kuznetsov,
О!
Собственно идея именно в этом и заключается.
Я это называю - поддерживаемость системы, наверно есть какой-то правильный термин, но мне сталкиваться не приходилось.
Разрабатывается система вся супер-пупер навороченная и правильная с точки зрения последих новшеств и открытий программостроения ... и даже работает ... почти. Возникает какой-то редкий сценарий при котором чего-то не срабатывает, и тогда надо носиться по всем компонентам и допиливать кусочки. Хочется минимизировать затраты на неизбежное - поддержку.
...
Рейтинг: 0 / 0
Как правильно открывать и закрывать транзакции базы данных из С# Framework.
    #38589248
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ay-y,

Почитайте про MVC и подумайте над архитектурой своей системы.
Но не советую сразу кидаться в омут с головой, взвесьте всё и вся, прежде чем браться за переделку архитектуры...
...
Рейтинг: 0 / 0
Как правильно открывать и закрывать транзакции базы данных из С# Framework.
    #38589799
Ay-y
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex Kuznetsov,

Спасибо.
...
Рейтинг: 0 / 0
28 сообщений из 28, показаны все 2 страниц
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как правильно открывать и закрывать транзакции базы данных из С# Framework.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]