Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Нужна ли в данной схеме транзакция?  [new]
Тимур
Member

Откуда: Санкт-Петербург
Сообщений: 339
Человек реализует сруктуру таблиц типа "звезда". Таблица фактов, таблица измерений ... Из хранилища данных в эту структуру заливаются расчитанные показатели. Человек, спроектировавший эту структуру отказывается от тразакций при заливке данных в таблицу фактов, мотивируя это тем, что все данные будут верными в пределах счета (речь идет о счетах, банковский учет). А если данные о каких-то счетах не попали в таблицу фактов, то это не основание для отката остальных данных, т.к. атомарно они верны. Недостающие данные он зальет потом, когда прочитает лог, о том что "произошла ошибка при заливке данных". Я хочу задать философский вопрос: "Насколько верна его позиция" ?
С моей точки зрения он не прав, т.к. его система может пребывать в трех состояниях - "есть данные", "нет данных" и "есть данные, но не все", что на мой взгляд неверно. Куда проще обнаружить отсутствие данных, чем разбираться в их целостности... Понятно, что одними транзакциями целостности не проверить, но по крайней мере можно сузить коридор возможных ошибок. И ... бухгалтеру не интересен отчет с небьющимся балансом, хотя бы подавляющее количество счетов в нем были верными.
Хотелось бы еще узнать, как реализован механизм заполнения кубов в MS SQL, в частности использует ли он транзакции при заполнении кубов ?
26 янв 04, 18:01    [507418]     Ответить | Цитировать Сообщить модератору
 Re: Нужна ли в данной схеме транзакция?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Человек, спроектировавший эту структуру отказывается от тразакций при заливке данных в таблицу фактов, мотивируя это тем, что все данные будут верными в пределах счета (речь идет о счетах, банковский учет).

Не совсем понятно почему у вас транзакция и логическая непротиворечивость данных являются синонимами ? Первое гарантируется сервером. Второе нужно создавать самому - в вашем случаем например с помощью Foreign constarint.

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

Все это определяется на стадии проектирования в разделе "Требования к системе".

Хотелось бы еще узнать, как реализован механизм заполнения кубов в MS SQL, в частности использует ли он транзакции при заполнении кубов ?
Речь идет про кубы в MS Analysis Services ? Или про какие кубы ?
26 янв 04, 19:02    [507505]     Ответить | Цитировать Сообщить модератору
 Re: Нужна ли в данной схеме транзакция?  [new]
guest
Guest
2Glory угу, а foreign key разве при загрузке bcp не отключаются?
26 янв 04, 19:43    [507557]     Ответить | Цитировать Сообщить модератору
 Re: Нужна ли в данной схеме транзакция?  [new]
Тимур
Member

Откуда: Санкт-Петербург
Сообщений: 339
Да, про кубы MS Analysis Services.

Не совсем понятно почему у вас транзакция и логическая непротиворечивость данных являются синонимами ? Первое гарантируется сервером. Второе нужно создавать самому - в вашем случаем например с помощью Foreign constarint.

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

В данном случае важно чтобы:
1) в кубе были данные необходимые и достаточные для построения отчетов.
2) эти данные должны быть достоверными, правильными с точки зрения прикладного уровня.

Ответственность за то, что заливаются правильные и достаточные данные лежит на модуле расчета показателей.
Модулю же заполнения куба расчитаными показателями необходимо гарантированно "отобразить" все в кубе. И если в этот момент произойдет сбой, то этого "отображения" не произойдет и данные лежащие в кубе покривеют, будет неполное отображение.
Причем данные, лежащие в его кубе, так же часто являются вх. данными для построения других отчетов. Таким образом, ошибка поползет дальше, в другие отчеты. Я смотрю на механизм транзакций, в данном случае, как на наиболее приемлемый для реализации гарантрованного отображения расчитанных показателй в куб. И не более того. Но и не менее.
Мне интересно Ваше мнение по этому поводу.
С уважением.
26 янв 04, 19:57    [507572]     Ответить | Цитировать Сообщить модератору
 Re: Нужна ли в данной схеме транзакция?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Да, про кубы MS Analysis Services.

Что-то я тогда не пойму. Там же все join-ы строятся как inner.
Если в таблице фактов есть ссылка на несуществующий элемент измерения то такой куб не должен строиться (в обратном случае может). Или у вас измерения строятся из самой таблицы фактов ?


2guest
И причем здесь опять же транзакция ?
26 янв 04, 20:03    [507579]     Ответить | Цитировать Сообщить модератору
 Re: Нужна ли в данной схеме транзакция?  [new]
Тимур
Member

Откуда: Санкт-Петербург
Сообщений: 339
Если в таблице фактов есть ссылка на несуществующий элемент измерения то такой куб не должен строиться (в обратном случае может).

Не совсем понятно про обратный случай .... Т.е. не все факты могут присутствовать в таблице фактов ?

Скорее в его схеме обратное - не все факты присутствуют в таблице фактов..., а с измерениями -то все в полном порядке.
Пример:
1 ) Есть счета, допустим 10 шт. (остатки по счетам).
2 ) Есть отчетная дата (01.01.2004)
3 ) Есть подразделение (Центральное отделение)
Всего три измерения. Три таблицы измерения + таблица фактов.
Таблицы измерения заполнены корректно. Есть дата, есть набор показателей (10 шт.), есть код подразделения. Теперь человек создает линеку фактов на пересечении этих измерений в таблице фактов . Соответственно в таблице фактов должно появится 10 записей типа следующей структуры
{ ид. счета | дата | ид. подразделения | значение } Запущена процедура заполнения, в таблицу полились данные ....
1 | 01.02.2004 | 1 | 2345.67
2 | 01.02.2004 | 1 | 34.35
3 | 01.02.2004 | 1 | 0.7
4 | 01.02.2004 | 1 | 3434.46
5 | 01.02.2004 | 1 | 6454.60
6 | 01.02.2004 | 1 | 54765.70
.................................................................
... далее произошел сбой и процедура заливки данных в таблицу фактов "умерла". В таблице остались факты, но не все. Они верны с точки зрения прикладного уровня, непротиворечат ограничениям самой таблицы, но их не хватает для построения отчета. Вопрос в том, правильно ли допускать такую ситуацию, или надо откатывать внесенные изменения ?
27 янв 04, 11:26    [508095]     Ответить | Цитировать Сообщить модератору
 Re: Нужна ли в данной схеме транзакция?  [new]
читатель
Guest
Почему все нужно вешать на транзакцию ?
В конце концов можно просто в начале заливки пометить день как "загружающийся", а в конце после всех проверок как "загруженный".
По крайней мере не будет длительной транзакции - а в реальной системе процесс перегрузки может длится несколько часов.
27 янв 04, 11:35    [508122]     Ответить | Цитировать Сообщить модератору
 Re: Нужна ли в данной схеме транзакция?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Не совсем понятно про обратный случай .... Т.е. не все факты могут присутствовать в таблице фактов ?

нет. Не для каждого элемента измерения должны присутствовать факты.

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

Вопрос в том, правильно ли допускать такую ситуацию, или надо откатывать внесенные изменения ?

Ну а какие требования предъявляет заказчик-то ? Можно ведь говорить и так, что данные в кубе верны на 31.01.2004, а все другие _имеющиеся_ данные - предварительные.
А можно и напротив говорить, что в кубе _отсутсвуют_ данные после 31.01.2004 по причине того, что оин предварительные.
27 янв 04, 11:41    [508142]     Ответить | Цитировать Сообщить модератору
 Re: Нужна ли в данной схеме транзакция?  [new]
Тимур
Member

Откуда: Санкт-Петербург
Сообщений: 339
2 читатель
Таким образом, вы берете на себя полную ответственность за то, что все факты лягут в куб, создаете свой механизм. Используете логи, состояния {"загружающийся","загруженный"} и т.д. Так в схеме и сделано. Я и спаршиваю, насколько это верно.
27 янв 04, 11:46    [508156]     Ответить | Цитировать Сообщить модератору
 Re: Нужна ли в данной схеме транзакция?  [new]
Тимур
Member

Откуда: Санкт-Петербург
Сообщений: 339
Что значит сбой ? У вся процедура выполняется в транзакции или каждый отдельный insert ?

При запуске процедуры заливки данных транзакция не открывается, в настройках сервера стоит autocommit. В теле процедуры присутствуют инсерты в таблицу фактов.
27 янв 04, 12:02    [508184]     Ответить | Цитировать Сообщить модератору
 Re: Нужна ли в данной схеме транзакция?  [new]
Glory
Member

Откуда:
Сообщений: 104760
INSERT INSERT-у рознь


INSERT ... SELECT TOP 1000 ...

это не то же самое что

while @i < 1000
begin
INSERT ... VALUES(...)
end


в настройках сервера стоит autocommit
Что еще за "autocommit" ??
27 янв 04, 12:07    [508197]     Ответить | Цитировать Сообщить модератору
 Re: Нужна ли в данной схеме транзакция?  [new]
Тимур
Member

Откуда: Санкт-Петербург
Сообщений: 339
INSERT INSERT-у рознь
Это я понимаю. Автокоммит - установка сервака, как я понимаю, на неявное открытие транзакции и ее коммит.
27 янв 04, 12:54    [508311]     Ответить | Цитировать Сообщить модератору
 Re: Нужна ли в данной схеме транзакция?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Это я понимаю.

Ну если понимаете, так что у вас делается в процедуре ?
Если все факты добавляются одиним INSERT-ом, то в случае его отката в таблице не должно быть.

Автокоммит - установка сервака, как я понимаю, на неявное открытие транзакции и ее коммит.

Скажите конкретно - о какой опции в каком диалоге идет речь. Подозреваю что мы говорим об SET IMPLICIT_TRANSACTIONS. Но вот проверяете ли вы какое значение имеет эта опция собственно перед запуском процедуры ?
27 янв 04, 13:02    [508331]     Ответить | Цитировать Сообщить модератору
 Re: Нужна ли в данной схеме транзакция?  [new]
Тимур
Member

Откуда: Санкт-Петербург
Сообщений: 339
Привести текст процедуры возможности нет =(( - сейчас нет доступа ни к исходникам, ни к базе. Процедуры заливки есть разные, в одних простой insert into ... from ...., другие состоят из нескольких подобных инсертов, и других инсертов. То есть, в одной ХП могут быть несколько инсертов. Проверки на состояние флага IMPLICIT_TRANSACTIONS нет.
27 янв 04, 13:38    [508435]     Ответить | Цитировать Сообщить модератору
 Re: Нужна ли в данной схеме транзакция?  [new]
Тимур
Member

Откуда: Санкт-Петербург
Сообщений: 339
Ну что ж, для себя я сделал следующий вывод: все зависит от того, как относиться к "полуданным". Можно как к предварительным, а можно как к неполным и ненужным. И в зависисмоти от этого бороться за чистоту партийных рядов или нет =)) Способы борьбы же разные: с транзакциями или без оных, с помощью своих механизмов. А чаще всего комбинированием мех. серавака + мех. прикладного ПО. Спасибо всем.
27 янв 04, 15:23    [508729]     Ответить | Цитировать Сообщить модератору
 Re: Нужна ли в данной схеме транзакция?  [new]
Тимур
Member

Откуда: Санкт-Петербург
Сообщений: 339
Не прошло и дня, как возникла ситуация, когда данные берутся из линейки (линейкой называются данные, лежащие в таблице фактов на пересечении измерений), с ними производятся вычисления и они опять записываются в эту же линейку поверх старых значений. Update идет построчный, т.е. "попоказательный" =). Соответственно, в этой схеме при сбое или по рд. причинам, не позволяющим продолжить выполнения заливки обновленных показателей в ту же (акцентирую =))) линейку, отката не произойдет и линейка покривеет. Соответственно, второй запуск модуля уже будет работать с "битой" линейкой. Что уже, считаю, просто недопустимо.
28 янв 04, 17:23    [511431]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить