Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Нужно ли делать следующее...?  [new]
Гость777
Guest
Доброго времени суток.
Проект написан на дельфях, обращение к MSSQL организовано через технологию ADO (один общий компонент ADOConnection). На 100% все изменения (добавление, редактирование, удаление) в БД организованы через хранимые процедуры (триггеры полностью отсутсвуют).

Перед тем как производить модификацию данных, обращаясь к хранимым процедурам, в проекте вызываеться ADOConnection.BeginTransaction, затем вызываться 5-10 различных хр. процедур… при исключении откатываем ADOConnection.RollbackTransaction, а если всё «ок», то ADOConnection.CommitTransaction.

В каждой хранимой процедуре, где есть модификация данных, я так же вызываю «Begin Transaction», «RollbackTransaction», «CommitTransaction».

Вопрос: А нужно ли вызывать Begin Transaction и т.п. в хранимых процедурах? Всё ли правельно я делаю. Если необязательно или этот момент являеться лишним, то почему?
24 авг 13, 14:00    [14751074]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли делать следующее...?  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28355
How to nest transactions nicely - "begin transaction" vs "save transaction" and SQL Server
24 авг 13, 14:33    [14751133]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли делать следующее...?  [new]
Гость777
Guest
skyANA,

Спасибо, но думаю данная статья не про мой вопрос! Или я что-то недопонял.

Жду других мнений)))
24 авг 13, 15:40    [14751243]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли делать следующее...?  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28355
Гость777, как раз таки про Ваш

Хотя если одна процедура редактирования - это одна инструкция UPDATE, то смысла вызывать Begin Transaction в ней нет.
24 авг 13, 16:54    [14751332]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли делать следующее...?  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
Гость777,

Клиентские транзакции - зло, каких мало. Подумайте, как будет выглядеть работа с сервером, когда на нем будет хотя бы 100 одновременных пользователей, при этом сервер будет стоять в Москве, а клиенты будут отовсюду, от Кёнига до Южно-Сахалинска. Малейшие провисания связи - и здравствуйте, очереди блокировок (RCSI призван устранить это, но только в теории - полностью он проблему не решает).

А еще очень весело бывает, когда такая клиентская транзакция налетает на какую-нибудь ошибку и забывает откатиться (или закоммититься, пофиг). Очень сложно объяснить человеку, что вся его работа за последние 2-4-6 часов сейчас пойдет псу под хвост просто потому, что кому-то когда-то показалось прикольной идеей делать это в гамаке и стоя выбрать такую реализацию целостности в БД.

Я более 7 лет занимался разработкой БД как раз в таком проекте. И все клиентские транзакции мы вычистили каленым железом сразу, как только смогли перейти на MSSQL 2005 и они стали не нужны.
24 авг 13, 19:40    [14751517]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли делать следующее...?  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28355
Ennor Tiegael
Клиентские транзакции - зло, каких мало.
А если к примеру данные распределены: часть в MS SQL Server, часть в MongoDB. И надо их обработать в рамках одной распределённой транзакции, то как поступают?
24 авг 13, 22:53    [14751763]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли делать следующее...?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
skyANA
Ennor Tiegael
Клиентские транзакции - зло, каких мало.
А если к примеру данные распределены: часть в MS SQL Server, часть в MongoDB. И надо их обработать в рамках одной распределённой транзакции, то как поступают?
Делают бизнес-транзакцию. То есть поступают так-же, как если бы часть данных было в MS SQL Server, часть в текстовых файлах, часть в письмах и т.п.

Транзакции СУБД всё таки слишком жёсткая вещь, что бы ими напрямую реализовывать бизнес-транзакции, это стратегически неправильный подход, хотя и очень простой - написал begin tran, и не парься.
25 авг 13, 00:44    [14751903]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли делать следующее...?  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
skyANA
Ennor Tiegael
Клиентские транзакции - зло, каких мало.
А если к примеру данные распределены: часть в MS SQL Server, часть в MongoDB. И надо их обработать в рамках одной распределённой транзакции, то как поступают?
И где в вашем изначальном посте упоминания про распределенные транзакции? Это совсем другая вещь.

Я не знаю, можно ли скрестить MongoDB с сиквелом так, чтобы они поддерживали распределенку напрямую. Если да, то потенциально можно сделать linked server в сиквеле и работать через него. Если нет, то придется писать, по сути, свой собственный DTC - причем делать это не в клиентском приложении, которое может быть запущено очень далеко и на очень ненадежном канале, а скорее всего в виде сервиса где-то рядом с БД, в той же локалке по возможности.

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

1. Клиент начал транзакцию, частично ее провел, и потом у него подвисла связь. Не явный дисконнект, а именно лаг. Для TDS такое поведение очень характерно, ибо он дизайнился в расчете на надежные и быстрые (LAN) каналы, а не на связь через интернет.
2. Клиент начал транзакцию, частично ее провел, а потом встал и ушел курить / пить чай / домой / на выходные / в отпуск. Все это время на сервере будут висеть блокировки, которые вам даже RCSI не разрешит (например, конфликт 2 писателей).
3. Клиент взял не штатное приложение, а какой-то свой клиент для MSSQL и начал играться "не по правилам". Например, вызывать все процедуры подряд, а не только те, которые должны быть вызваны + в произвольном порядке. Если на серверной стороне не контролируется допустимый workflow, то к данным в БД быстро придет маленькая белая лисичка. Если же контролируется, то зачем тогда клиентские транзакции?..
25 авг 13, 08:33    [14751997]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли делать следующее...?  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28355
Ennor Tiegael
skyANA
пропущено...
А если к примеру данные распределены: часть в MS SQL Server, часть в MongoDB. И надо их обработать в рамках одной распределённой транзакции, то как поступают?
И где в вашем изначальном посте упоминания про распределенные транзакции?
Нигде. Просто поинтересовался. Спасибо за ответ.
25 авг 13, 09:04    [14752010]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли делать следующее...?  [new]
Гость777
Guest
Добрый день. Я использую MSSQL2008R2 Express (это тот, который немного гастрирован, условно бесплатный).

Ennor Tiegael
Гость777,
И все клиентские транзакции мы вычистили каленым железом сразу, как только смогли перейти на MSSQL 2005 и они стали не нужны.


Непонял, что Вы имели ввиду. Какие механизмы появились в MSSQL 2005, взамен транзакциям? Двукратно буду благодарен за ответ подкреплённый ссылкой на статейку.

Вы правы в том, что в любом проекте будут кретические места, когда транзакция "залочит" сервер на пару секунд (пару секнд - это я про свой проект).
25 авг 13, 11:59    [14752131]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли делать следующее...?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
Гость777
Непонял, что Вы имели ввиду. Какие механизмы появились в MSSQL 2005, взамен транзакциям? Двукратно буду благодарен за ответ подкреплённый ссылкой на статейку.
Наверное, имеется в виду, что управлять транзакциями из приложния хуже, чем из процедур MSSQL. Я тоже выжигал.
25 авг 13, 12:04    [14752138]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли делать следующее...?  [new]
Гость777
Guest
alexeyvg
Гость777
Непонял, что Вы имели ввиду. Какие механизмы появились в MSSQL 2005, взамен транзакциям? Двукратно буду благодарен за ответ подкреплённый ссылкой на статейку.
Наверное, имеется в виду, что управлять транзакциями из приложния хуже, чем из процедур MSSQL. Я тоже выжигал.


Чем будет отличаться начало и завершение транзакции????
MSSQL "залочит" модификацию данных и так и так... в чём разница... непонятно
25 авг 13, 12:22    [14752169]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли делать следующее...?  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28355
Гость777, я запускаю рабочий комп, открываю приложение (оно соединяется с сервером, что стоит в соседней комнате, здании, городе или чёрт знает где), жму кнопку (в коде выполняется ADOConnection.BeginTransaction), и тут свет отрубили... Моя транзакция зависла и блокирует нормальную работу.

Вот на одну из таких неприятных ситуаций, что может произойти при использовании клиентских транзакций, Вам и намекают.
25 авг 13, 15:30    [14752424]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли делать следующее...?  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
Гость777,

В 2005 появился тип данных xml, в котором стало возможно передавать множество записей за один вызов процедуры. До этого документ вида master-detail передавали за один вызов хранимки, создающей основную запись, и несколько (иногда много) вызовов хранимок, создающие детали документа. Потом вызывалась валидация и только после этого делался коммит.

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

Открыть транзакцию - пакет ушел на сервер, ждем - ответ отправлен, ждем когда придет.
Вызываем хранимки - каждая ушла, ждем - ответ от каждой отправлен, ждем.
Коммитим - пакет ушел на сервер, ждем - ответ отправлен, ждем когда придет.

Сейчас, когда вы сидите в сервером в одной сети, а особенно если на той же машине, вы этих постоянных "ждем-ждем-ждем" не заметите. Но если система разрастется и у вас появятся люди, работающие с сервером из других городов, вы моментально увидите все те эффекты, о которых я говорю.
25 авг 13, 15:50    [14752444]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли делать следующее...?  [new]
Гость777
Guest
Ennor Tiegael
Гость777,

В 2005 появился тип данных xml, в котором стало возможно передавать множество записей за один вызов процедуры. До этого документ вида master-detail передавали за один вызов хранимки, создающей основную запись, и несколько (иногда много) вызовов хранимок, создающие детали документа. Потом вызывалась валидация и только после этого делался коммит.

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

Открыть транзакцию - пакет ушел на сервер, ждем - ответ отправлен, ждем когда придет.
Вызываем хранимки - каждая ушла, ждем - ответ от каждой отправлен, ждем.
Коммитим - пакет ушел на сервер, ждем - ответ отправлен, ждем когда придет.

Сейчас, когда вы сидите в сервером в одной сети, а особенно если на той же машине, вы этих постоянных "ждем-ждем-ждем" не заметите. Но если система разрастется и у вас появятся люди, работающие с сервером из других городов, вы моментально увидите все те эффекты, о которых я говорю.


Спасибо, по поводу XML не вкурсе. Очень хорошая идея... тут в несколько раз можно увеличить производительность системы и повысить надёжность.

Вы можите дать несколько примеров, или статейки на эту тему, как правельно передавать XML. Былобы супер, еслиб в Вашем примере был код на дельфях и код на SQL...
25 авг 13, 16:12    [14752480]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли делать следующее...?  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28355
Ennor Tiegael
В 2005 появился тип данных xml, в котором стало возможно передавать множество записей за один вызов процедуры. До этого документ вида master-detail передавали за один вызов хранимки, создающей основную запись, и несколько (иногда много) вызовов хранимок, создающие детали документа. Потом вызывалась валидация и только после этого делался коммит.
Видел решения через временные таблицы.
25 авг 13, 16:16    [14752487]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли делать следующее...?  [new]
Гость777
Guest
skyANA
Ennor Tiegael
В 2005 появился тип данных xml, в котором стало возможно передавать множество записей за один вызов процедуры. До этого документ вида master-detail передавали за один вызов хранимки, создающей основную запись, и несколько (иногда много) вызовов хранимок, создающие детали документа. Потом вызывалась валидация и только после этого делался коммит.
Видел решения через временные таблицы.


Уважаемый, вы читали суть вопроса?!
Временные таблицы в данном случае только усложнят ситуацию
25 авг 13, 17:01    [14752585]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли делать следующее...?  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
skyANA
Ennor Tiegael
В 2005 появился тип данных xml, в котором стало возможно передавать множество записей за один вызов процедуры. До этого документ вида master-detail передавали за один вызов хранимки, создающей основную запись, и несколько (иногда много) вызовов хранимок, создающие детали документа. Потом вызывалась валидация и только после этого делался коммит.
Видел решения через временные таблицы.
Решения чего - вставки записей в несколько разных таблиц за одно обращение к серверу?
25 авг 13, 18:15    [14752778]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли делать следующее...?  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
Гость777,

Передавать-то его как раз просто: обычный параметр, как и все. А вот парсить его на серверной стороне - это уже бывает заковыристее... Но тут лучше сначала посмотреть примеры работы с XML на сервере, попробовать самому и потом уже возвращаться с конкретными вопросами "А как сделать вот такое?..".
25 авг 13, 18:19    [14752786]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли делать следующее...?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31960
Гость777
Чем будет отличаться начало и завершение транзакции????
MSSQL "залочит" модификацию данных и так и так... в чём разница... непонятно
Разница в том, что время транзакции увеличится на время обработки сетевых пакетов драйверами, время работы всяческих библиотек, ну и так далее.
А самое главное, невнимательные программисты (уверен, подавляющее большинство, даже не 90%) будут делать вычисления, ожидать событий от ОС, ожидать системных ресурсов и т.п. не озаботившись завершить транзакцию. Они даже не будут ни о чём думать, для них ADOConnection.CommitTransaction - просто строчка, которую велел написать начальних.

Соответственно можно легко спргогнозировать, что производительность сервера упадёт в десяток раз.

А, ну вот, Ennor Tiegael про всё это уже написал...
skyANA
тут свет отрубили... Моя транзакция зависла и блокирует нормальную работу.
Вообще в принципе коннект должен разорваться и транзакция откатится.
Но да, это ещё потребует времени. вроде коннект рвётся не моментально.
Гость777
skyANA
Видел решения через временные таблицы.

Уважаемый, вы читали суть вопроса?!
Временные таблицы в данном случае только усложнят ситуацию
Как я понимаю, имеется в виду, что транзакции с клиента не стартуются, а вроеменные таблицы используются вместо XML для передачи данных.
Что, вполне хороший подход.

Ещё для этих целей можно использовать таблицы-параметры.
25 авг 13, 19:10    [14752899]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли делать следующее...?  [new]
Гость777
Guest
Ennor Tiegael,

Есть на примете статья на эту тему?
25 авг 13, 19:10    [14752901]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли делать следующее...?  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
Гость777
Ennor Tiegael,

Есть на примете статья на эту тему?
Я не пишу клиентский код, но знаю, как найти примеры.
25 авг 13, 19:16    [14752916]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли делать следующее...?  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 28355
alexeyvg
Гость777
пропущено...

Уважаемый, вы читали суть вопроса?!
Временные таблицы в данном случае только усложнят ситуацию
Как я понимаю, имеется в виду, что транзакции с клиента не стартуются, а вроеменные таблицы используются вместо XML для передачи данных.
Что, вполне хороший подход.
+1

Это и имел ввиду.
25 авг 13, 21:37    [14753290]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли делать следующее...?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Если вы затрагиваете проблему взаимодействия, надёжности и скорости, то тут ещё встаёт вопрос о фантомах.
Если не используется клиентская транзакция, то надо всё равно соблюдать протокол взаимодействия.
Не скажу на счёт канала SQL, но например HTTP, и SOAP от MS (IIS) в частности вполне допускает дублирование запросов.
Т.е. в канале должен быть уникальный глобальный идентификатор.

Притом клиент может тупо упасть с пропажей всех данных, после того как на сервере всё закоммителось, и потом не учитывать это обстоятельство.

Табличные параметры дают меньше нагрузку (как на сервер так и на клиент), чем XML.

В трёхзвенках как раз чаще так и делается, что транзакции относительно локальны, апликешн сервер "близок" к серверу БД.
К тому же, не всё можно сделать через скуль, бывают легче/необходимо/возможно объединять системы через апликуху.

Кстати, недавно беседе с alexeyvg мы затрагивали этот вопрос: 14680546
alexeyvg
Делают бизнес-транзакцию.
А вы можете просвятить это термин? А то я не встречал данную терминологию и ничего нормального не могу найти про неё. Ну или ссылочку скиньте.
Заранее благодарен.
Вы имели ввиду многоэтапный процесс?

На счёт транзакция vs многоэтапный процесс.
В чём различие между SQL локировкой или логической локировкой (определённая правильностью процесса)?
В простоте первой (транзакция), но из-за мания всё пихать в одну кучу вероятность ошибки и отката увеличивается.
Во втором случае всё практически ассинхронно. Но, всё равно вся данная операция в обоих случаях будет блокирована и зависать, без возможности её вернуть обратно или продвинуть, до восстановления связи. Лаг неизбежен и это не свойство DTC.

А вот в стратегии есть различие - "чуть что откатить" vs "попытаться пропихнуть ещё раз" даже после падений. В случае DTC нет декларативности, он не знает что надо делать дальше (поэтому откат). А вот если был определён атомарный пакет заранее, то можно было и докатить. Аля Service Broker.
+ Dev
Ennor Tiegael
можно сделать linked server
Вот кажись то описалово как программировать свой LS для DTC.
OLE DB Simple Provider
КО
26 авг 13, 01:48    [14753900]     Ответить | Цитировать Сообщить модератору
 Re: Нужно ли делать следующее...?  [new]
Гость777
Guest
Добрый день.

Mnior

Табличные параметры дают меньше нагрузку (как на сервер так и на клиент), чем XML.



Что такое табличные параметры? Это Вы про использование временных таблиц?

Если несложно подкрепите Ваш ответ ссылкой на описание/примеры использования. Спасибо!
26 авг 13, 13:10    [14755397]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить