Форум: "Базы";
Текущий архив: 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