Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.30;
Скачать: CL | DM;

Вниз

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

 
Дельфятник   (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;
Скачать: CL | DM;

Наверх




Память: 0.6 MB
Время: 0.047 c
2-1144932563
dera
2006-04-13 16:49
2006.04.30
Как решить проблему?


15-1144504847
kcg
2006-04-08 18:00
2006.04.30
"Сканер транслятора"


2-1144853236
Mickey-74
2006-04-12 18:47
2006.04.30
Как верно отображать кирилицу, если нет ASCII?


3-1141885514
Елена
2006-03-09 09:25
2006.04.30
Иерархические запросы


8-1133365011
Yozj
2005-11-30 18:36
2006.04.30
микширование на лету