Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];

Вниз

Не осилил вопросы по транзакциям на собеседовании   Найти похожие ветки 

 
Дельфятник   (2006-03-06 18:29) [0]

1) В каких случаях надо использовать механизм транзакций
а) при редактировании данных
б) при удалении данных
в) в любом случае
г) при редактировании и/или удалении данных?
И зачем вообще нужен механизм транзакций?

2) Есть следующий код:
try
 if not Database.InTransaction then Database.StartTransaction;
 Database.Commit;
except
 on E: Exception do
 begin
   ShowMessage(E.Message);
   Database.Rollback
 end
end;
В результате его выполнения программа выдала сообщение об ошибке. Пользователь по каким-то причинам не нажал "ОК", сообщение так и осталось висеть. По какой причине через некоторое время эта транзакция съест все ресурсы SQL-сервера?


 
Fay ©   (2006-03-06 18:32) [1]

2 Дельфятник   (06.03.06 18:29)
> По какой причине через некоторое время эта транзакция съест все ресурсы SQL-сервера?
IMHO, нет таких причин.


 
Дельфятник   (2006-03-06 18:34) [2]

> IMHO, нет таких причин.

Вот и я тоже так думал. А интервьюер был уверен в обратном.


 
Fay ©   (2006-03-06 18:38) [3]

2 Дельфятник   (06.03.06 18:34) [2]
> А интервьюер был уверен в обратном.
Это бывает. Бывает и хуже.


 
Дельфятник   (2006-03-06 18:39) [4]

То есть, смысл его второго вопроса был в том, что в случае, когда в результате выполнения транзакции управление передаётся в блок except .. end, то не будет выполнен откакт транзакции до тех пор, пока пользователь не нажмёт "ОК". А если пользователь, к примеру, отошёл чай попить, или ушёл с работы (в отпуск :) ), то программа так и будет дожидаться, пока он не нажмёт "ОК", и до этих пор отката транзакции не произойдёт. И пока программа будет ждать от пользователя нажатия "ОК" транзакция будет поглощать ресурсы. Я так и не понял, почему.


 
Fay ©   (2006-03-06 18:44) [5]

> И пока программа будет ждать ... транзакция будет поглощать ресурсы
Бред какой-то


 
Desdechado ©   (2006-03-06 18:45) [6]

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


 
Fay ©   (2006-03-06 19:01) [7]

Видимо, речь шла про IB/FB и кучу версий данных. Но для постоянного "поглощения ресурсов" все должны ходить пить чай. Массово и почаще.


 
Дельфятник   (2006-03-06 19:03) [8]

Ладно, со вторым вопросом разобрались, спасибо. А что с первым вопросом?


 
Desdechado ©   (2006-03-06 19:33) [9]

все действия с БД - через транзакции, по другому не получится
дело только в явном или неявном их использовании
нужно для обеспечения целостности и непротиворечивости данных, а также для разруливания претензий пользователей при массовой работе


 
Romkin ©   (2006-03-06 19:36) [10]

Если это таки IB/FB, то на первый вопрос контра: А каким образом транзакцию можно не использовать?! А так ответ: всегда! И нужны они для атомарности.
А во втором вопросе: какой сервер, во-вторых, какие параметры транзакции, в-третьих, млин, нормальные люди пишут raise а не showmessage хотя бы из уважения к другим программерам. И тогда и не спутаешь, когда Rollback вызывать.
В общем, тест ясно показывает квалификацию его составителя ;)


 
Дельфятник   (2006-03-06 19:55) [11]

Если всегда, то зачем нужно использовать транзакции для чтения? Разве может нарушиться атомарность при использовании select?

2 Romkin: Контора, которая проводила собеседование, использует MS SQL.


 
Reindeer Moss Eater ©   (2006-03-06 19:56) [12]

то зачем нужно использовать транзакции для чтения?

Это определяется исключительно логикой приложения.


 
Romkin ©   (2006-03-06 19:58) [13]

Дельфятник   (06.03.06 19:55) [11] А вот там эти два вопроса имеют другой смысл :) На MSSQL можно менять данные не в транзакции...
А атомарность при использовании select еще как может нарушиться. Прочитаешь несогласованные данные


 
Desdechado ©   (2006-03-06 21:34) [14]

Romkin ©   (06.03.06 19:58) [13]
> На MSSQL можно менять данные не в транзакции.
Что-то слабо верится. Может, все-таки транзакция стартует неявно?


 
Petr V. Abramov ©   (2006-03-06 22:00) [15]

> По какой причине через некоторое время эта транзакция съест все ресурсы SQL-сервера?
 Ни по какой причине транзакция не съест все ресурсы неидиотского SQL-сервера. Если database не реагирует на commit, то она ни на что не среагирует.

> И зачем вообще нужен механизм транзакций?
 Для обеспечения логической согласованности данных (логическость определяется ТЗ) Из этого и следует ответ на вопрос.

P.S. Похоже, непрохождение данного собеседования для Вас удача. Независимо от уровня владения DB Concepts Ж)


 
Дельфятник   (2006-03-06 22:28) [16]

>Если database не реагирует на commit, то она ни на что не среагирует.

Там между StartTransaction и Commit ещё чего-то было, но я не запомнил, что именно.

Насколько я понимаю, Database.StartTransaction открывает сессию, в рамках которой можно получать данные на момент её открытия. Это что касается чтения.
Касательно редактирования/добавления/удаления. Проект с ипользованием дельфийских транзакций, который я видел, был написан сначала под BDE, потом переделан на DOA (под Oracle). Дельфийские транзакции там использовались только для редактирования и удаления записей. Они там использовались как средство обеспечения многопользовательского режима. Тот проект вообще был какой-то корявый - широко использовались TTable для всевозможных операций с данными, поэтому весь код был утыкан этими StartTransaction. Пользователь программы = пользователь Oracle.
В другом проекте, в котором не было ни строчки с StartTransaction, и который также успешно обеспечивал многопользовательский режим, использовал в основном TQuery, и вообще произвёл на меня более приятное впечатление. Пользователь программы <> пользователь Oracle.

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


 
Дельфятник   (2006-03-06 22:36) [17]

Кстати, анкету с этим вопросом я уже видел на двух собеседованиях - в Росевробанке, и в этой конторе (pmt, что ли).


 
Johnmen ©   (2006-03-06 23:07) [18]

>Дельфийские транзакции

:))))))))))))))

Я понимаю, что ты не очень понимаешь по теме, но это какое-то бредовое словосочетание...

1. Понятие тр-ии относится к СУБД, и только к ней.
2. НИКАКОЙ запрос к БД не м.б. выполнен вне рамок тр-ии.
3. Если в приложении нет явного старта/подтверждения/отката тр-ии, то они ВСЁ РАВНО есть, просто неявные с т.з. твоего кода.

ЗЫ
Мы говорим о настоящих серверах БД.
ЗЗЫ
В инете материала на данную тему валом...


 
Nikolay M. ©   (2006-03-06 23:10) [19]

Первый вопрос описан в любой книге по базам данных, собственно RME все сказал: зависит от логики. А вот второй


> По какой причине через некоторое время эта транзакция съест
> все ресурсы SQL-сервера?


сформулирован некорректно - как минимум. Возможно, работодатель подразумевал ситуацию, когда незавершенная транзакция не освобождает заблокированные ресурсы и все последующие запросы, выполняемые ДРУГИМИ пользователями, будут дожидаться окончания данной транзакции, что повышает(??) нагрузку на сервер. Хотя для этого нужно постоянно обращаться к одним и тем же данным(?).
Соглашусь, что, вопрос довольно бредовый, хотя бывают и хуже...

Можно узнать название фирмы, где такое спрашивают?


 
Дельфятник   (2006-03-06 23:34) [20]


> 1. Понятие тр-ии относится к СУБД, и только к ней.
> 2. НИКАКОЙ запрос к БД не м.б. выполнен вне рамок тр-ии.
>
> 3. Если в приложении нет явного старта/подтверждения/отката
> тр-ии, то они ВСЁ РАВНО есть, просто неявные с т.з. твоего кода.


Это-то я всё знаю. Но что отвечать на вопрос, который сформулирован таким образом:
1) В каких случаях надо использовать механизм транзакций
а) при редактировании данных
б) при удалении данных
в) в любом случае
г) при редактировании и/или удалении данных
?

Я так понял, что имеется в виду, что спрашивается, когда следует использовать Database.StartTransaction. Или я ошибаюсь?


> Можно узнать название фирмы, где такое спрашивают?


PMT. Собеседование проводил технический директор. Почтовый домен у них topnet.ru. Фирма находится в Москве, Скатертный пер.,  д. 8\1, стр.1.


 
ANB ©   (2006-03-06 23:36) [21]


> Дельфятник   (06.03.06 18:29)

По первому вопросу :
Явные транзакции (в T-SQL их тоже объявляют явно) используются для согласованных изменений, которые проводят в несколько шагов и нужно обеспечить, чтобы они выполнялись либо все, либо ни одна. Для одного оператора - это лишняя работа, которая может привести к ошибке.

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


 
evvcom ©   (2006-03-07 09:08) [22]

Не жалей, что не попал. Работать с такими - не большое удовольствие. И учиться ничему не научишься, и нервов потрепишь, доказывая, что ты не верблюд.


 
msguns ©   (2006-03-07 09:31) [23]

>Romkin ©   (06.03.06 19:36) [10]
>А так ответ: всегда!

Нет. Как пример: работа с БД через локальный буфер (TClientDataSet например)

>И нужны они для атомарности.

Что понимается под "атомарностью" применительно к БД ? Сколько ни встречал определение термина "транзакция" это слово мне не попадалось.
Частично верное определение дано в Petr V. Abramov ©   (06.03.06 22:00) [15]

>Johnmen ©   (06.03.06 23:07) [18]
>>Дельфийские транзакции
>Я понимаю, что ты не очень понимаешь по теме, но это какое-то бредовое словосочетание...

Вовсе не такое бредовое, как может показаться с первого взгляда. Реализация механизма неявных транзакций компонентами доступа к БД в Дельфи (TXXDataSet к примеру, работа через буферы изменений, клиентский датасет с механизмом "пакетных" изменений..) заложена именно разработчиками дельфи (точнее, компонент БД) и носит признаки определенной стратегии.


 
msguns ©   (2006-03-07 09:47) [24]

>1) В каких случаях надо использовать механизм транзакций

Транзакциями можно управлять (использовать или нет - это не компетенция клиента) в тех случаях, где это возможно. Для некоторых локальных БД (dBase, Paradox etc) их нет как явления и все "управление" ими из "дельфишных" или еще каких-то компонент не более, чем фикция.

Транзакциями нужно управлять явно, если это диктуется требованиями "клиентской" логики и не реализовано напрямую на сервере.

Как простейший пример - вставка нового "сложного" объекта в БД с "клиента":
Сначала вставляется новая запись в Мастер-таблицу
Извлекается ее ID
Вставляется запись в детал с полем связки = ID мастера

Это все должно выполняться строго "комплексно", т.е. в контексте одной транзакции.

>И зачем вообще нужен механизм транзакций?

1. Обеспечения целостности БД в любой момент времени. Для гарантированного перехода БД из одного целостного состояния в другое либо возврата к исходному целостному состоянию
2. "Разруливания" конкурентных соединений (сессий) разных пользователей одной и той же БД.
3. Гибкого управления многоэтапными зависимыми модификациями в БД.

>2) Есть следующий код:
try
if not Database.InTransaction then Database.StartTransaction;
Database.Commit;
..

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


 
msguns ©   (2006-03-07 09:54) [25]

Транзакции нужны не только для изменений. Они чрезвычайно важны и для правильного чтения.
ИМХО, весьма неплохо описан суть транзакционности у Вострикова с Ковязиным в "Мире интербэйза".
Непонимание назначения, правил использования и принципов взаимодействия транзакций неизбежно приводит к появлению грубых ляпов в работе ПО в многопользовательских БД.

Еще. При попытке закоммитить транзакцию запросто можно получить зависание. Но не из-за того, что "транзакция съела все ресурсы", а из-за возникновения ситуации зацикливания взаимозависимых модификаций (deadlock в Interbase), либо может "повиснуть" сервер, если при конкурентных выборках-изменениях неверно задан уровень изоляции транзакций (для некоторых серверов)


 
Val ©   (2006-03-07 10:57) [26]

>msguns ©   (07.03.06 09:31)

> Нет. Как пример: работа с БД через локальный буфер (TClientDataSet
> например)

пример чего?

по поводу атомарности - это ваш "комплексный" простейший пример из поста 24 :)


 
msguns ©   (2006-03-07 11:37) [27]

>Val ©   (07.03.06 10:57) [26]
>> Нет. Как пример: работа с БД через локальный буфер (TClientDataSet
>> например)
>пример чего?

Пример "заката солнца вручную", а именно: работы без транзакций.

>по поводу атомарности - это ваш "комплексный" простейший пример из поста 24 :)

Глупости. "Атомарность" - это неделимость, законченность сущности. Вставка единственной записи (как в примере) - это может быть все, что угодно, в том числе и "кусочек" целой серии изменений, целью которых является ОДНО действие. Например, добавление документа в БД. "Урезанный" документ не может быть документом т.к. он элементарно недостоверен.

Хочется поспорить ?
;)


 
Сидоров Максим Вадимович   (2006-03-07 11:50) [28]

Случайно обнаружил обсуждение наших тестов
Итак:
Вопрос про транзакции расчитан на то, понимает ли человек что явно применять их в Delphi имеет смысл только в случае групповой обработки связанных изменений. Так что правильного ответа среди вариантов просто нет. Многие люди это понимают и приходят к этому выводу после наводящих вопросов.
Текст вопроса:
1) В каких случаях надо использовать механизм транзакций
а) при редактировании данных
б) при удалении данных
в) в любом случае
г) при редактировании и/или удалении данных?
И зачем вообще нужен механизм транзакций?
Ответ в случае связанных изменений данных


 
Сидоров Максим Вадимович   (2006-03-07 11:59) [29]

Случайно обнаружил обсуждение наших тестов
Итак: Вопрос про корректное завершение транзакции
Вопрос был расчитан на то, понимает ли человек что сначала надо откатывать транзакции, а уж потом вызывать обработку ошибок и сообщений пользователю.
Краткий текст вопроса: Что выбрать а) или б)
а)
Database.Commit;
except
on E: Exception do
begin
  Database.Rollback
  ShowMessage(E.Message);
end
end;

б)
Database.Commit;
except
on E: Exception do
begin
  ShowMessage(E.Message);
  Database.Rollback
end
end;

PS: само применение ShowMessage здесь не принципиально, так как пример писался на ходу, а не взят из реального кода. Для понимающих, естественно лучше здесь вызвать типизированный Raise. А сообщение об ошибках уже выдавать в централизированном обработчике ошибок.

Вопрос про блокировки и deadlock"и ,был наводящим, так как человек выбрал вариант б). А вообще если в транзакции заняты часто используемые данные, то естественно сервер выполняя запросы других клиентов будет терять ресурсы. Так как другие транзакиции будут ждать зависшую. Если таймаут по откату незавершенной транзакции большой, а кол-во пользователей велико, то это теоретически может привести и к падениям сервера. Также теоритически могут возникать и deadlock


 
Sergey13 ©   (2006-03-07 12:01) [30]

2[28] Сидоров Максим Вадимович   (07.03.06 11:50)
Вы правы отчасти, но вопросы у вас сформулированы мягко говоря некорректно.
Например в Оракле (да и везде собственно) вся сессия по умолчанию = одна транзакция. Т.е. если я явно не укажу Commit, то в случае сбоя откатится вся сессия. Если даже я редактировал в гриде по одной записи. Не говоря уже о ресурсах сервера, это странный подход. Кроме того, что считать явным применением? Установка свойства сессии типа AutoCommit - это явное применение или нет?


 
Nikolay M. ©   (2006-03-07 12:11) [31]


> А вообще если в транзакции заняты часто используемые данные,
>  то естественно сервер выполняя запросы других клиентов
> будет терять ресурсы. Так как другие транзакиции будут ждать
> зависшую. Если таймаут по откату незавершенной транзакции
> большой, а кол-во пользователей велико, то это теоретически
> может привести и к падениям сервера. Также теоритически
> могут возникать и deadlock


Хм. Значит, в [19] я угадал.
Тем не менее вопрос, КМК, ОЧЕНЬ не корректен и, возможно, свидетельствует о некотором непонимании спрашивающим механизма deadlock-ов. Незакрываемая в течении бесконечного времени транзакция - не обязательно источник возникновения дедлоков. Не говоря уже о том, что к падению сервера (теоретическому) приведет только ОЧЕНЬ большое количество запросов, обращающихся на соответственном уровне изоляции к тем же ресурсам, которые заблокировала незакрытая транзакция.


 
Fay ©   (2006-03-07 12:17) [32]

2 Romkin ©   (06.03.06 19:58) [13]
> На MSSQL можно менять данные не в транзакции...
Ну как не стыдно...


 
Romkin ©   (2006-03-07 12:24) [33]

А разве нет? :) Что-то где-то у меня мелькало, связанное с изменением данных в ХП. Хотя могу и ошибаться, не работал


 
ANB ©   (2006-03-07 12:26) [34]


> Сидоров Максим Вадимович   (07.03.06 11:59) [29]

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


 
Сидоров Максим Вадимович   (2006-03-07 12:30) [35]

Я ведь и написал теоритически. А вопрос сформулирован предельно корректно. Вопрос был про два варианта и какой из них правильный.
Честно говоря не хочется устраивать свалку в форуме, так как известно сколько людей, столько и мнений. Просто мне важно при обсуждении теста с кандидатом, чтобы он пояснил свои ответы. Человек может ошибиться, в том числе и я. Если кандидат аргументировано убедит меня в моей неправоте (кстати такие случаи бывали), или поймет в результате наводящих вопросов, в чем он не прав, то вопрос считается засчитанным.


 
Nikolay M. ©   (2006-03-07 12:35) [36]


> Сидоров Максим Вадимович   (07.03.06 12:30) [35]
> Я ведь и написал теоритически. А вопрос сформулирован предельно
> корректно. Вопрос был про два варианта и какой из них правильный.


Допустим (теоретически), что с базой работает только один пользователь. В этом случае оба Ваших варианта равнозначны - открытая транзакция кушать не просит. В условиях об этом не сказано ни слова, следовательно, вопрос некорректен.


 
msguns ©   (2006-03-07 12:36) [37]

>Сидоров Максим Вадимович   (07.03.06 11:50) [28]
>Итак:
Вопрос про транзакции расчитан на то, понимает ли человек что явно применять их в Delphi имеет смысл только в случае групповой обработки связанных изменений. Так что правильного ответа среди вариантов просто нет. Многие люди это понимают и приходят к этому выводу после наводящих вопросов.

1. Причем тут Дельфи ?
2. Транзакциями можно, а иногда и нужно управлять явно не только при групповых изменениях и вообще не только при изменениях, но при извлечениях данных с сервера. Например, в следящих системах.
3. Зачем к вопросу предлагаются варианты ответов, если "правильного среди них нет" ? Чтобы ввести респондента в заблуждение ? Странный метод экзаменовки.
Для человека, элементарно знакомого с базами данных (транзакции вообще тут не при чем), вообще непонятно, какая разница с точки зрения изменения БД между удалением, добавлением или изменением записей. Более того, у этого человека вполне может возникнуть дилемма:
а) а не дурак ли составлявший тест ?
           и
б) не пытаются ли из меня сделать дурака ?

ЗЫ. То, на каком уровне сегодня преподают базы данных в некоторых вузах люди, лишь теоретически с ними знакомые, наслышан и даже "насмотрен".
Вот и еще один пример ;(


 
Fay ©   (2006-03-07 12:38) [38]

2 Сидоров Максим Вадимович   (07.03.06 11:59) [29]
Приложение, в котором можно получить deadlock таким образом, нужно переписывать - deadlock-и будут возникать и в более "мягких" ситуациях.


 
Сидоров Максим Вадимович   (2006-03-07 12:40) [39]

Уважаемый Nikolay M., еще раз говорю, вопрос про ресурсы и deadlock"и был наводящим и вспомогательным к основному вопросу теста про обработку исключения внутри транзакции.
Условия этого ДОПОЛНИТЕЛЬНОГО вопроса вы вообще знать не можете, так как не были на собеседовании и не знаете контекста обсуждения основного вопроса.
PS: Извините господа, мне надо работать
Всего хорошего


 
msguns ©   (2006-03-07 12:40) [40]

Поправка к [37]:

Извиняюсь за "пинок" в сторону вузов, ибо сабж вовсе не из той "оперы". Однако мнение свое о "среднем" уровне преподавания БД в высшей школе оставляю при себе.
Кстати, не исключено, что автор теста обучался именно в таком вузе.



Страницы: 1 2 3 вся ветка

Форум: "Базы";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.59 MB
Время: 0.012 c
3-1141401246
_RusLAN
2006-03-03 18:54
2006.04.30
TIBScript. Отобразить процесс выполнения скрипта.


4-1139198374
Nike
2006-02-06 06:59
2006.04.30
Получение информации о EXE


2-1144930611
Der Nechk@ssoff
2006-04-13 16:16
2006.04.30
Типизация файла


4-1139395573
rOOse
2006-02-08 13:46
2006.04.30
PopUp Menu


3-1141905491
Megabyte
2006-03-09 14:58
2006.04.30
Вызов одной ХП внутри другой





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский