Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
06.03.2014, 21:56
|
|||
---|---|---|---|
Как правильно открывать и закрывать транзакции базы данных из С# Framework. |
|||
#18+
Это скорее вопрос стиля и дизайна, но хочется послушать разные мнения о том как правильно вводить данные в базу. Распространённая ситуция. Надо ввести данные в SQL Server базу предположим по такому сценарию. 1. Ввести И.Ф.О. человека в тавлицу User и получить его ID из этой таблицы. 2. Использовать это ID при вставлении данных в таблицу Address. Если по какой-то причине данные в Address не вставились, то данные из таблицы User тоже должны быть убраны. Понятно что в данном случае можно написать одну strored procedure и забыть. Но существуют гораздо более сложные ситуации, когда лучше использовать несколько процедур, или производить какую-то бизнесс логику в бизнесс уровне, а не в базе данных. Как это делать правильно? И вообще кто как это делает? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.03.2014, 22:49
|
|||
---|---|---|---|
Как правильно открывать и закрывать транзакции базы данных из С# Framework. |
|||
#18+
Ay-y, Все в единой транзакции в хранимой процедуре Ay-yНо существуют гораздо более сложные ситуации, когда лучше использовать несколько процедур Вызвать все эти ХП из другой ХП ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.03.2014, 23:16
|
|||
---|---|---|---|
Как правильно открывать и закрывать транзакции базы данных из С# Framework. |
|||
#18+
Cat2, Это то как мы сейчас делаем. По рабоче-крестьянски. Просто тут кругом пишут что бизнесс логика должна находиться в бизнесс слое. Что в общем-то хорошо и наверно правильно, но мне лично непонятно как это организовать. А самое главное, какие за и против за такую архитектуру. Когда всё в ХП - всё просто, понятно и железобетонно. А вот если надо ХП в разных базах запустить но чтоб если в одной ошибка изменения в другой - rollback. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.03.2014, 23:32
|
|||
---|---|---|---|
Как правильно открывать и закрывать транзакции базы данных из С# Framework. |
|||
#18+
Ay-yразных базах запустить но чтоб если в одной ошибка изменения в другой - rollback распределённые транзакции никто не отменял ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.03.2014, 08:03
|
|||
---|---|---|---|
Как правильно открывать и закрывать транзакции базы данных из С# Framework. |
|||
#18+
Ay-yПросто тут кругом пишут что бизнесс логика должна находиться в бизнесс слое. Миллионы лемммингов не могут ошибаться ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.03.2014, 18:39
|
|||
---|---|---|---|
Как правильно открывать и закрывать транзакции базы данных из С# Framework. |
|||
#18+
Cat2, Ну я думаю, что я тоже могу ошибаться. Хорошо иногда посмотреть на собственные привычки, может пора менять чего. Жысть меняется, интересно-же знать чего нового-хорошего в мире, а то так-бы и лабали на Паскале илу Вижуал Басике 6. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.03.2014, 21:52
|
|||
---|---|---|---|
|
|||
Как правильно открывать и закрывать транзакции базы данных из С# Framework. |
|||
#18+
Ay-y, Вот тут рассмотрен очень интересный вариант http://habrahabr.ru/post/31632/ Предлагается уйти от стандартного подхода, когда ключ - Integer. Предлагается использовать GUID'ы для всех уникальных ключей. В статье доказывается куча преимуществ. Как я понимаю, минус лишь в объеме памяти (сколько там байт занимает Гуид ?), но не думаю, что эта проблема критичная, в наше то время терабайтных флешек и дискет. В частности решается и ваша проблема "записать в таблицу, чтобы узнать ID, который будет сгенерирован". Guid по определению уникален :) Там еще и другие бонусы описаны Сам подумываю, не применить ли этот подход. Рабочие проекты переделывать уже не буду, а вот в новом проекте, можно попробовать. PS. Там в коментариях пишут, что в Windows на системном уровне при генерации GUID ставится какая-то задержка. Не знаю правда ли это. Нужно проверить, запустив генерацию миллиона гуидов и посмотреть время. Если задержки на системном уровне нет, то все должно пройти за секунду. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
07.03.2014, 23:41
|
|||
---|---|---|---|
Как правильно открывать и закрывать транзакции базы данных из С# Framework. |
|||
#18+
MsSql_Study Вы только еще про sequental guid'ы почитайте и, знаете, guid'ы, как это ни печально, не столь уж и уникальны :) ... ну а вообще... просто, не как библию, а для общего развития, пролистайте http://www.ozon.ru/context/detail/id/2628672/ Только все то, что там написано очень близко к сердцу не принимайте :) ну и на id ots не обращайте внимания... метр порой перегибал... :) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
08.03.2014, 00:19
|
|||
---|---|---|---|
Как правильно открывать и закрывать транзакции базы данных из С# Framework. |
|||
#18+
Ay-yа то так-бы и лабали на Паскале илу Вижуал Басике 6. Да хоть на чем лабай, если бизнес логика в базе ... |
|||
:
Нравится:
Не нравится:
|
|||
|
08.03.2014, 00:34
|
|||
---|---|---|---|
Как правильно открывать и закрывать транзакции базы данных из С# Framework. |
|||
#18+
MsSql_StudyПредлагается уйти от стандартного подхода, когда ключ - Integer. Предлагается использовать GUID'ы для всех уникальных ключей. В статье доказывается куча преимуществ. MsSql_Study. Увидели знакомое слово и решили поделится открытием что гуиды лучше чисел? Вы вообще понимаетен о чем в этом топике разговор? Ay-yЖысть меняется, интересно-же знать чего нового-хорошего в мире, а то так-бы и лабали на Паскале илу Вижуал Басике 6. Да все тоже самое. Разработчики баз придумали, как убивать зависшие на клиенте транзакции. Теперь можно прямо в коде клиента открыть транзакцию, сделать действия, и закрыть ее. Исчезла страшилка, что бухгалтер начал транзакцию и ушел в отпуск. Современные базы такие транзакции откатывают через разумное время. Длительность "разумного времени" разработчиками не раскрывается. Только вот если бизнес-логика в базе, то не важно на чем к ней писать клиента. Трехзвенку используют те, кто не умеет писать хранимые процедуры и тригеры ... |
|||
:
Нравится:
Не нравится:
|
|||
|
08.03.2014, 06:16
|
|||
---|---|---|---|
Как правильно открывать и закрывать транзакции базы данных из С# Framework. |
|||
#18+
Ay-y, Про TransactionScope читали? msdn.microsoft.com/en-us/library/system.transactions.transactionscope(v=vs.110).aspx ... |
|||
:
Нравится:
Не нравится:
|
|||
|
08.03.2014, 18:53
|
|||
---|---|---|---|
Как правильно открывать и закрывать транзакции базы данных из С# Framework. |
|||
#18+
Ay-yправильно вводить данные в базу.Способов много и все они правильные. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.03.2014, 16:32
|
|||
---|---|---|---|
Как правильно открывать и закрывать транзакции базы данных из С# Framework. |
|||
#18+
Cat2, Хочется убрать бизнесс логику из базы, ну или скорее так, разнести бизнесс логику. Что-то загнать в базу, а что-то оставить в бизнесс уровне. Вот вам ёщё упрощённый пример. Чтобы быть в контексте с предидущим примером... Нанимается бригада людей. Надо записать бригаду, и всех её членов в базу, если один из членов не вставился, всё отработать назад и не создавать бригаду в базе. Можно вызывать процедуры одну из другой, это понятно. Можно загнать массив данных как XML и уже в процедуре их перелопачивать, это тоже понятно. Можно, как уже тут сказали, использовать TransactionScope, вот тут уже инересно, кто-то иаспользовал? Какие плюсы и минусы? Мне лично не нравится что его нельзя унаследовать или сделать частью другой транзакции. Ещё варианты есть? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.03.2014, 16:56
|
|||
---|---|---|---|
|
|||
Как правильно открывать и закрывать транзакции базы данных из С# Framework. |
|||
#18+
Ay-yCat2, Хочется убрать бизнесс логику из базы, ну или скорее так, разнести бизнесс логику. Что-то загнать в базу, а что-то оставить в бизнесс уровне. Вот вам ёщё упрощённый пример. Чтобы быть в контексте с предидущим примером... Нанимается бригада людей. Надо записать бригаду, и всех её членов в базу, если один из членов не вставился, всё отработать назад и не создавать бригаду в базе. Можно вызывать процедуры одну из другой, это понятно. Можно загнать массив данных как XML и уже в процедуре их перелопачивать, это тоже понятно. Можно, как уже тут сказали, использовать TransactionScope, вот тут уже инересно, кто-то иаспользовал? Какие плюсы и минусы? Мне лично не нравится что его нельзя унаследовать или сделать частью другой транзакции. Ещё варианты есть? Есть. 1. Завязывайте с курением. 2. Научитесь грамотно писать по-русски. 3. Забудьте про XML, TransactionScope, массив данных и вызов процедуры из процедуры. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
10.03.2014, 18:49
|
|||
---|---|---|---|
Как правильно открывать и закрывать транзакции базы данных из С# Framework. |
|||
#18+
UInt64Ay-yCat2, Хочется убрать бизнесс логику из базы, ну или скорее так, разнести бизнесс логику. Что-то загнать в базу, а что-то оставить в бизнесс уровне. Вот вам ёщё упрощённый пример. Чтобы быть в контексте с предидущим примером... Нанимается бригада людей. Надо записать бригаду, и всех её членов в базу, если один из членов не вставился, всё отработать назад и не создавать бригаду в базе. Можно вызывать процедуры одну из другой, это понятно. Можно загнать массив данных как XML и уже в процедуре их перелопачивать, это тоже понятно. Можно, как уже тут сказали, использовать TransactionScope, вот тут уже инересно, кто-то иаспользовал? Какие плюсы и минусы? Мне лично не нравится что его нельзя унаследовать или сделать частью другой транзакции. Ещё варианты есть? Есть. 1. Завязывайте с курением. 2. Научитесь грамотно писать по-русски. 3. Забудьте про XML, TransactionScope, массив данных и вызов процедуры из процедуры. А по существу вопроса сказать чего есть? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
11.03.2014, 09:09
|
|||
---|---|---|---|
Как правильно открывать и закрывать транзакции базы данных из С# Framework. |
|||
#18+
Ay-y...использовать TransactionScope... Как-то был случай, заказчик стал жаловаться, что перестало взаимодействие двух систем работать. Причем снаружи все гладко, ни одна из взаимодействующих систем ошибок не выдает. Долго не могли понять причины, в процессе "танцев с бубнами" в логах windows нашли периодически появляющуюся ошибку связанную с распределенной транзакцией. По итогам расследования, оказалось: БД перенесли на Win Server 2008, а компонент в котором создавалась распределенная транзакция работал на 2003 (или 2000, точно не помню), и собственно 2008 "не принимал" в эту транзакцию, от чего она откатывалась. С портами файрвола еще что-то было. Админ заказчика вопрос решил обновлением Windows. Перед тем как использовать распределенную транзакцию, хорошо присмотрелся бы к "среде" где будет это все работать. По поводу вызовов ХП в разных базах. Видел варианты когда один MS SQL работает с ХП и удаленными запросами другого. "В поле" часто глючит, и не показалось "надежным" вариантом (хотя связано скорей всего с локальной сетью). Возможно, в подобном варианте лучше открывать транзакции в двух базах в коде клиента/апп сервера? Если что-то не вставилось в одну базу, то это возможно отловить кодом и в другой также откатить. GUID vs ID В виду использования репликации, везде используем GUID, первое сильно время плевался, сейчас видится, что как минимум ничем не хуже целочисленного ID, в большей степени вопрос привычки. Да и явно удобнее при "переносе" и слиянии данных. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
11.03.2014, 16:53
|
|||
---|---|---|---|
Как правильно открывать и закрывать транзакции базы данных из С# Framework. |
|||
#18+
Кифирчик, Мы тоже используем репликации, поэтому у нас конечно GUID, но сейчас работают над совмещением всех баз в одну (и это правильно), но вот мне лично GUID не нравится, хочется от него избавиться совсем. Конечно эти проблемы будет решать DBA, но разработчиков тоже коснётся. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
12.03.2014, 09:05
|
|||
---|---|---|---|
|
|||
Как правильно открывать и закрывать транзакции базы данных из С# Framework. |
|||
#18+
Cat2...Трехзвенку используют те, кто не умеет писать хранимые процедуры и тригеры Оппаньки... Весьма сильное заявление. А так-то мужики и не знают... Ну теперь им глазки-то приоткрыли... ... |
|||
:
Нравится:
Не нравится:
|
|||
|
12.03.2014, 10:42
|
|||
---|---|---|---|
|
|||
Как правильно открывать и закрывать транзакции базы данных из С# Framework. |
|||
#18+
Ay-yUInt64пропущено... Есть. 1. Завязывайте с курением. 2. Научитесь грамотно писать по-русски. 3. Забудьте про XML, TransactionScope, массив данных и вызов процедуры из процедуры. А по существу вопроса сказать чего есть? Я отвечал вам именно по существу, если вы не поняли. Достаточно было прочесть ваш первый пост в этой ветке (ну и посмотреть статистику ваших сообщений в Просто Трёп), чтобы понять, что вы - ни разу не разработчик. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.03.2014, 16:50
|
|||
---|---|---|---|
Как правильно открывать и закрывать транзакции базы данных из С# Framework. |
|||
#18+
UInt64, Ну не знаете, так не знаете, ничего страшного в этом нет. Я вот тоже не знаю, только спрашивать не стесняюсь. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
13.03.2014, 16:51
|
|||
---|---|---|---|
Как правильно открывать и закрывать транзакции базы данных из С# Framework. |
|||
#18+
Alex KuznetsovCat2...Трехзвенку используют те, кто не умеет писать хранимые процедуры и тригеры Оппаньки... Весьма сильное заявление. А так-то мужики и не знают... Ну теперь им глазки-то приоткрыли... А что используют знающие мужики? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
14.03.2014, 13:35
|
|||
---|---|---|---|
|
|||
Как правильно открывать и закрывать транзакции базы данных из С# Framework. |
|||
#18+
Ay-yAlex Kuznetsovпропущено... Оппаньки... Весьма сильное заявление. А так-то мужики и не знают... Ну теперь им глазки-то приоткрыли... А что используют знающие мужики?А знающие мужики действуют в зависимости от задач проекта и архитектуры решения. И соответственно в необходимых случаях используют либо клиент/серверную архитектуру, либо N-звенную. Обычно бизнес логику выносят в "средний" слой в крупных проектах, работа которых не должна зависеть от конкретной реализации того или иного диалекта работы с БД, а будет использовать в основном ANSI SQL, т.е. то, что должно поддерживаться как минимум всеми поставщиками БД. Естественно, что в таком случае происходит отказ от использования хранимых процедур и триггеров, т.к. при переходе на другую БД пришлось-бы переписывать много кода... Относительно Вашего вопроса: Отказаться от использования DataAware компонентов. "Собирать" информацию в памяти, затем выполнить "быструю" транзакцию, состоящую из вставки данных в различные таблицы. И зафиксировать её в случае успешности или откатить в случае ошибки... Открывать транзакцию лучше перед работой с таблицами, закрывать/откатывать сразу по завершении. Можно даже на основе собранной информации сгенерировать SQL скрипт и выполнить его "одним махом". ... |
|||
:
Нравится:
Не нравится:
|
|||
|
14.03.2014, 14:55
|
|||
---|---|---|---|
Как правильно открывать и закрывать транзакции базы данных из С# Framework. |
|||
#18+
Alex KuznetsovОтказаться от использования DataAware компонентов. "Собирать" информацию в памяти, затем выполнить "быструю" транзакцию, состоящую из вставки данных в различные таблицы. И зафиксировать её в случае успешности или откатить в случае ошибки... Открывать транзакцию лучше перед работой с таблицами, закрывать/откатывать сразу по завершении. Можно даже на основе собранной информации сгенерировать SQL скрипт и выполнить его "одним махом". +1 Среди основных требований к транзакции имеется и её короткое время жизни. Cat2Трехзвенку используют те, кто не умеет писать хранимые процедуры и тригеры Точно. Или те, которым скорости СУБД не хватает. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
14.03.2014, 16:16
|
|||
---|---|---|---|
Как правильно открывать и закрывать транзакции базы данных из С# Framework. |
|||
#18+
Alex Kuznetsov, Спасибо. Где моьно почитать и посмотреть хорошие примеры? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
15.03.2014, 11:20
|
|||
---|---|---|---|
|
|||
Как правильно открывать и закрывать транзакции базы данных из С# Framework. |
|||
#18+
Ay-yAlex Kuznetsov, Спасибо. Где моьно почитать и посмотреть хорошие примеры?Попытайтесь найти книги по архитектуре крупных решений, таких, как например SAP, MS Dynamix AX, 1С 8.2 и т.д. В общем-то правило одно, транзакция должна быть как можно короче по времени, т.е. открыл транзакцию, тут-же изменил данные и сразу закрыл транзакцию. Дело в том, что в сложных, высоко нагруженных системах, необходимо стремиться к снижению нагрузки на базу данных, соответственно предпочтительней не выносить бизнес логику на уровень БД дабы не нагружать излишне сервер БД неспецифичной для него работой. В малых системах, там где применение среднего слоя нецелесообразно в силу решаемых задач, вынесение бизнес логики на уровень базы данных будет достаточно хорошим решением, т.к. позволит разделить бизнес логику работы с данными от их представления, и соответственно снизить затраты на разработку и сопровождение как отдельных компонентов системы, так и всех системы в целом. У меня был поучительный опыт работы с Oracle E-Business Suite, в ходе которой я увидел как не стоит разрабатывать сложные ERP системы. Связано это с тем, что изначально на архитектурном уровне в OEBS позволено размещать бизнес логику как на клиентском уровне, т.е. представление данных(Oracle Forms), так и на среднем уровне, плюс в добавок на уровне БД, в виде тех-же хранимых процедур, функций и триггеров. И вот представьте, что есть бизнес процесс, логика которого "размазана" по всем этим уровням. И нужно его доработать либо изменить. Сответственно нужно проанализировать в каком именно месте нужно будет вносить изменения/дополнения, ну а затем собственно их внести. Теперь представьте, что по какой-то причине оказалось, что часть изменений придётся сделать на уровне представления (ну например добавить какие-то вычисления), а часть на уровне хранимых процедур и триггеров(мало-ли). Соответственно вместо того, чтобы сделать доработку в одном месте (на среднем уровне) придется её делать в трёх разных местах... ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=20&tablet=1&tid=1403132]: |
0ms |
get settings: |
9ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
53ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
70ms |
get tp. blocked users: |
2ms |
others: | 334ms |
total: | 508ms |
0 / 0 |