Главная страница
    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]:

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


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

2 Сидоров Максим Вадимович   (07.03.06 11:50) [28]
> понимает ли человек что явно применять их в Delphi имеет смысл
При чём тут Delphi?!


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

DELPHI тут при том, что тестировался человек именно на знание дельфи.
Был еще отдельный тест на знание SQL, но он здесь почему то не обсуждается:). Видимо у кандидата не возникло по ним вопросов, хотя в них есть несколько интересных и спорных вопросов для обсуждения.
Вернет ли следующий запрос записи и какие?
select * from table where field = NULL


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

2 Сидоров Максим Вадимович
> Условия этого ДОПОЛНИТЕЛЬНОГО вопроса вы вообще знать не можете
А почему мы должны его знать? Что это за вопросы, ответ на которые требует наводящих вопросов? И как по-Вашему, должен чувствовать себя человек на собеседовании, когда ему уже подсказывают (хрень какую-то), а до него никак не доходит (какая-то хрень)?

> PS: Извините господа, мне надо работать
Почему-то впоминается анекдот про мальчика на велосипеде и водителя КамАЗа... Бр-р-р-р...

Всего хорошего.


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

2 Сидоров Максим Вадимович   (07.03.06 12:47) [42]
> select * from table where field = NULL
В MSSQL можно получить разные (пустой и не очень) наборы данных. Зависит от сервера. Вы про какой спрашивали?


 
Sergey13 ©   (2006-03-07 12:51) [45]

2[42] Сидоров Максим Вадимович   (07.03.06 12:47)
И что в этом вопросе/запросе спорного?


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

Fay ©   (07.03.06 12:43) [41]
Fay ©   (07.03.06 12:49) [43]

[37] ;))

>Сидоров Максим Вадимович   (07.03.06 12:47) [42]
>Вернет ли следующий запрос записи и какие?
>select * from table where field = NULL

Ааа, это тест на ясновидение ? Чел должен прочитать мысли спрашивающего, ага ?

Хотя, действительно, в некоторых стандартах сиквеля (например, в Local SQL) такой запрос вернет.. ошибку синтаксиса.


 
Сидоров Максим Вадимович   (2006-03-07 13:05) [47]

Правильно, зависит от установок сервера. Сервер MS SQL, но насколько я знаю настройки этого поведения есть на всех основных серверах.
select * from table where field = null
Стандартное поведение по ANSI не вернет ничего, потому что любое сравнение с NULL ложно
Вот на этот вопрос 90% людей отвечают, что они бы использовали следующую конструкцию: where field is null, но почему не знают. То есть очень немногие знают что сравнивать так все таки можно, что вернет это сравнение и зачем на самом деле введено ISNULL (это по поводу шаблонного мышления).
тогда следует наводящий вопрос: а если сравнение происходит с переменной, которая set @a= NULL.
select * from table where field = @a
Начинаются затыки.
Тогда задается вопрос про если where field =  null + 1. Тут большинство сразу говорит что так делать нельзя.
Следующий наводящий вопрос:
set @a= NULL
select * from table where field = @a +1
В результате люди понимают что сравнивать с NULL все таки можно.
Некоторые говорят что сервер приведет это к форме
select * from table where field = 0 + 1 и вернет все записи где field = 1
Далее следует вопрос что вернет сравнение field < NULL
В общем часть народа после серии доп.вопросов доходит до того, что любые операции сравнения с NULL ложны, а любые выражения с NULL = NULL
В вузах к сожалению этому не учат (в большинстве, как показывает практика), а ошибка эта довольно распространенная при разработке хр.процедур и триггеров, так как NULL может залететь в переменную где угодно и дальнейшая обработка данных с использованием этой переменной без проверок на NULL будет выполнятся совсем не так, как задумал программист.


 
MOA ©   (2006-03-07 13:07) [48]

Кстати, запрос с =NULL весьма разумен на собеседовании. ОТ ответа человека можно двигаться дальше. В большинстве баз (близких к теории) без исправления установок по умолчанию - ответ во-первых очевиден во вторых сразу понятен уровень понимания.


 
Fay ©   (2006-03-07 13:20) [49]

2 Сидоров Максим Вадимович   (07.03.06 13:05) [47]
Какие-то странные люди к вам приходят. Это на какую зарплату, если не секрет?


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

Я просто показал на примере как происходят такие вот доп.вопросы к основному, в том случае если человек отвечает неправильно или не может пояснить свой ответ.
Так что здесь надо знать контекст вопроса, чтобы его обсуждать. Тестирование у нас происходит не в виде тупых тестов, а в виде обсуждения ответов на тесты. Иногда такие обсуждения вскрывают в кандидате знания, которые тестами не охвачены. Иногда я узнаю что то новое. В любом случае после обсуждения тестов становится понятно насколько человек владеет Delphi и SQL, в каких областях он силен.


 
Fay ©   (2006-03-07 13:23) [51]

2 Сидоров Максим Вадимович   (07.03.06 13:05) [47]
> любое сравнение с NULL ложно
Хи-хи-хи... Не ложно, а NULL

use pubs

select * from JOBS where JOB_ID = null
select * from JOBS where not (JOB_ID = null)


 
Сидоров Максим Вадимович   (2006-03-07 13:33) [52]

Вы удивитесь, но люди, которые не знают как программировать объектно (не умеют РЕАЛЬНО использовать все прелести наследования, объектов, классов и интерфейсов), знают SQL на базовом уровне (знают что такое left join, sum, count, но не отвечают на более сложные вопросы, тот же having, union, нюансы вычислений условий по or и т.д.) просят от 1200 и выше.
То есть человек имеет базовый опыт программирования интерфейсов на дельфи и SQL и ВСЕ. Для меня такой человек все еще студент, которого надо учить грамотно писать код, не делать стандартных ляпов, обрабатывать исключения, применять try finally, и еще куче всего. То есть учить всему тому, что приходит с опытом. То что для меня очевидно и то что я делаю уже рефлекторно, для них в новинку.
Приходится искать компромис и выбирать людей, которые либо уже умеют все это и платить им больше среднего или брать людей, которых можно этому быстро научить, платить им меньше и заниматься их развитием.


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

Все Господа, удачи!!!
У меня работа стоит и уже нависает надо мной снежным комом


 
Nikolay M. ©   (2006-03-07 13:35) [54]

Ну, собственно, это личное дело каждого, как ему проводить собеседования. Могу только искренне позавидовать тем, кто может себе позволить отказать соискателю, например, потому, что он не знает, что такое SET ANSI_NULLS.
А нельзя ли тех кандидатов, которые не знают, чему будет равняться результат NULL + 1, отправлять ко мне? Я как раз дельфиста - мсскульщика ищу, может для меня и сгодится?


 
Fay ©   (2006-03-07 13:40) [55]

2 Сидоров Максим Вадимович   (07.03.06 13:33) [52]
> заниматься их развитием
Оно Вам надо? Сомнительное вложение денег. IMHO, нужно брать людей с "уровнем" не ниже достаточного.

Удачи.


 
Sergey Masloff   (2006-03-07 13:40) [56]

Fay ©   (07.03.06 13:20) [49]
Да на любые зарплаты такие люди приходят :( А в последнее время что-то почти только такие и приходят... :(((


 
Romkin ©   (2006-03-07 13:41) [57]

Fay ©   (07.03.06 13:23) [51] Хихихи, не NULL, а undefined :)))
А трехзначной логике не слышал, чтобы в институтах учили. А насчет косяков на собеседовании я тоже много могу порассказать...
Например, на
a). Имеется таблица

create table T (
 Дата  date,
 Валюта char(3),
 Курс numeric,
 primary key (Дата, Валюта)
);

Данные:

Дата      Валюта    Курс
------------------------
01.09.04  USD       29.8
02.09.04  EUR       35.4
03.09.04  USD       29.7
05.09.04  USD       29.6
06.09.04  USD       29.8
06.09.04  EUR       35.6
...

Напишите запрос, выдающий курс заданной валюты на заданную дату.
Курс считается определенным, если для данной валюты
есть запись с датой не превосходящей заданную, взять ближайший курс.
Запрос должен выдать курс в обеих случаях:
- курс USD на 06.09.04
- курс USD на 04.09.04

Отвечает 1 из 20 !!!, а на Чему будет равно W после выполнения следующего кода процессором Intel x86? Ответ
объяснить.

type
PWord = ^word;
var
I: integer;
W: word;
begin
I := High(I) shr 8;
W := PWord(Integer(@I) + 2)^;
end;
(С) Зотов :)
Я видел только одного человека на собеседовании, который ответил! За все время, я даже затрудняюсь сказать, какой процент.
Так что обычные люди, опытные программисты вроде...


 
Сидоров Максим Вадимович   (2006-03-07 13:44) [58]

Ну так в тесте не 1 вопрос, а решение об отказе прнимается по сумме всех вопросов + моему субъективному мнению по итогам собеседования + анализу примеров исходных кодов сискателя. Так что могу вам сходу бросить десяток другой email"ов соискателей, которых мы не взяли. Берите, собеседуйте... Возможно кого то и отберете, просто у нас требования к соискателю довольно жесткие. Я считаю что лучше взять продвинутого программиста или подющего надежды подороже, чем мучится с ним за наши же деньги.


 
Fay ©   (2006-03-07 13:52) [59]

2 Romkin ©   (07.03.06 13:41) [57]
> Я видел только одного человека на ...
Честно говоря, я это без бумажки (в уме) не решу. Нет такой постоянной практики. Хотя задачка не сложная.


 
Sergey Masloff   (2006-03-07 13:56) [60]

Fay ©   (07.03.06 13:52) [59]
Аналогично. И я в свое время вступал с Юрием в полемику по поводы пользы от такого вопроса ;-) Хотя ему виднее я лично против превращения собеседований в тест-контроль. И не только теоретически (против) а и на практике это воплощаю по мере сил ;-) Вполне достаточно поговорить с человекам о проектах в которых он принимал участие а там уже построить цепочку и пораспросить.


 
paul_k ©   (2006-03-07 14:21) [61]

> [57] Romkin ©   (07.03.06 13:41)

у тебя слишком хорошая статистика.
4 из 200 смогли написать подобный запрос.


 
isasa ©   (2006-03-07 14:31) [62]

Fay ©   (07.03.06 13:52) [59]
Тут проще. Надо помнить, что x86 хранит младший байт(полуслово) первым.
Ответ $7F.


 
Fay ©   (2006-03-07 14:33) [63]

2 isasa ©   (07.03.06 14:31) [62]
> Надо помнить, что x86 хранит младший байт(полуслово) первым.

Звучит так, будто не зная этого, тоже можно решить, но труднее. LOL.


 
isasa ©   (2006-03-07 14:38) [64]

Сидоров Максим Вадимович   (07.03.06 13:44) [58]
По поводу вопросов. Тестовые вопросы должны быть однозначны.
А вопросы с перечислениями ответов, среди которых правильного нет(и это известно интервьэру) - просто заведомая провокация. За такие тесты, составителя обычно бьют, возможно, даже ногами.


 
Romkin ©   (2006-03-07 14:38) [65]

paul_k ©   (07.03.06 14:21) [61] Ну я мухлюю немного ;)
Fay ©   (07.03.06 13:52) [59] А кто сказал, что без бумажки? Другой вопрос, когда у человека в резюме стоит два года асма, а он на логических сдвигах плавает - о чем может быть разговор?!
90% вообще не понимают, что or может быть арифметическим. 80% не слышали о "having". И это не менее чем с трехлетним опытом программирования!


 
isasa ©   (2006-03-07 14:40) [66]

Fay ©   (07.03.06 14:33) [63]
:) Так сдвиг адреса на 2 байта. :)


 
Fay ©   (2006-03-07 14:43) [67]

2 isasa ©   (07.03.06 14:40) [66]
И чё? Хоть на 3


 
Sergey13 ©   (2006-03-07 16:05) [68]

2[53] Сидоров Максим Вадимович   (07.03.06 13:35)
>Все Господа, удачи!!!
>У меня работа стоит и уже нависает надо мной снежным комом
Да ладно, Вадимыч. Зажигай дальше.
Ждем-с. Заходи.

ЗЫ: сори. я уже слегка.....


 
ANB ©   (2006-03-07 16:12) [69]


> И это не менее чем с трехлетним опытом программирования!

Сказки. У меня в первой конторе после 2-недельных курсов доподготовки 90% об этом знали (включая меня). Как и о мутациях таблиц, connect by, rownum и прочих вкусностях. Причем никто раньше с ораклом не работал. На выпускных экзаменах PL/SQL девелопер (сокращенный, есно) рисовали за 2 часа. 10 процентов не въехавших сами уволились.


 
Fay ©   (2006-03-07 16:15) [70]

2 ANB ©   (07.03.06 16:12) [69]
> Сказки.
Будьте осторожны в суждениях. Действительно, кто сказал, что эти ребята программировали 3 года не лифты, а что-то другое...


 
Bless ©   (2006-03-07 16:40) [71]

Romkin ©   (07.03.06 13:41) [57]>
А вопрос с валютой надо решить без подзапроса?


 
Fay ©   (2006-03-07 16:44) [72]

2 Romkin ©   (07.03.06 13:41) [57]
> Хихихи, не NULL, а undefined
Вы меня просто удивляете. NULL и есть undefined, а не "пусто".


 
Romkin ©   (2006-03-07 17:32) [73]

Fay ©   (07.03.06 16:44) [72] Да нет, разница есть. Терминологическая, в результате операции сравнения нельзя получить NULL, можно только говорить, что ее результат не определен (undefined).


 
Romkin ©   (2006-03-07 17:33) [74]

Bless ©   (07.03.06 16:40) [71] Кто такое сказал? Эссно, его надо решать с подзапросом :))


 
Romkin ©   (2006-03-07 17:37) [75]

Fay ©   (07.03.06 16:44) [72] Поясню мысль: считается, что выражения вида where (a > b) is NULL недопустимы. Если бы результат сравнения был NULL, то кто мешает?


 
Fay ©   (2006-03-07 19:36) [76]

2 Romkin ©   (07.03.06 17:37) [75]
А выражения (a > b) = (c > d) допустимы?


 
Romkin ©   (2006-03-07 21:24) [77]

Fay ©   (07.03.06 19:36) [76] Э. Нет :)
Тут другое. Есть правило, что любое сравнение с NULL  дает неопределенность. А дальше вступают в силу таблицы истинности для or and not. И там самое интересное, что True or Undefined дает True. Или False and Undefined дает False. Дело именно в этом. Если говорить, что сравнение с NULL дает NULL - а дальше? какой результат должен быть у (a<b) and NULL?
Вот именно об этом я и говорил, не видел я курса трехзначной логики.


 
Fay ©   (2006-03-07 21:39) [78]

2 Romkin ©   (07.03.06 21:24) [77]
Я не очень корректно выразился в [72]. Ну ты, наверное, уже в курсе 8)


 
Romkin ©   (2006-03-07 21:58) [79]

Fay ©   (07.03.06 21:39) [78]
А мне тоже стыдно :(
Ну, ты, наверное, уже в курсе :)
2all: это насчет того, что будет при наличии if then else, если в условии возникает сравнение с NULL.
К сожалению, похоже, все при этом выполняют блок else...


 
Petr V. Abramov ©   (2006-03-07 22:51) [80]

Если первый вопрос считать вежливой(?) провокацией и выводм на дискуссию,
то второй - бред полный

try
if not Database.InTransaction then Database.StartTransaction;
Database.Commit;
except
on E: Exception do
begin
  ShowMessage(E.Message);
  Database.Rollback
end
end;

ошибка возникает либо на StartTransaction, либо на commit. Это возникнуть может, когда ресурсы, похоже, уже съедены :)

Если транзакция так ине стартовала, то есть она ничего не будет. Если сервер не реагирует на commit, он скорее всего, ни на что уже не среагирует (спецслучаи Oracle не берем), и не к месту написанный ShowMessage тут ни при чем


 
Дельфятник   (2006-03-08 00:06) [81]


> Например, на
> a). Имеется таблица
>
> create table T (
>  Дата  date,
>  Валюта char(3),
>  Курс numeric,
>  primary key (Дата, Валюта)
> );
>
> Данные:
>
> Дата      Валюта    Курс
> ------------------------
> 01.09.04  USD       29.8
> 02.09.04  EUR       35.4
> 03.09.04  USD       29.7
> 05.09.04  USD       29.6
> 06.09.04  USD       29.8
> 06.09.04  EUR       35.6
> ...
>
> Напишите запрос, выдающий курс заданной валюты на заданную
> дату.
> Курс считается определенным, если для данной валюты
> есть запись с датой не превосходящей заданную, взять ближайший
> курс.
> Запрос должен выдать курс в обеих случаях:
> - курс USD на 06.09.04
> - курс USD на 04.09.04
>
> Отвечает 1 из 20 !!!,


Я попробовал это сделать на Oracle. Вот что у меня получилось:
create table TT_TEMP
( FDATE DATE,
 CURR  VARCHAR2(3),
 RATE  NUMBER)

create or replace function TT_GetRate(pDate in Date, pCurr in varchar2) return varchar2 is
 s varchar2(200);
begin
 select
   case
     when exists(select rate from TT_TEMP
                      where FDate = pDate and Curr = pCurr)
       then (select distinct to_char(rate) from TT_TEMP
               where FDate= pDate and Curr = pCurr)
     when exists(select rate from TT_TEMP where Curr = pCurr)
       then
         case
           when pDate <= (select min(FDate) from TT_TEMP where Curr = pCurr)
             then "Нет данных о курсе "||pCurr||" на заданную дату ("||to_char(pDate)||")"
           else
             (select distinct to_char(rate) from TT_TEMP
              where Curr = pCurr and
                FDate = nvl((select max(FDate) from TT_TEMP
                                  where Curr= pCurr and FDate <= pDate),
                                 (select max(FDate) from TT_TEMP
                                  where Curr= pCurr)
              )
           end
       else "Нет данных о курсе данной валюты ("||pCurr||")"
    end
 into s
 from dual;
 return(trim(s));
end TT_GetRate;

И, наконец, запрос
select TT_GetRate("06.09.2004","USD") rate1,
        TT_GetRate("04.09.2004","USD") rate2
from dual

выдаёт то, что нужно:

Rate1 | Rate2
29,8      29,7

По-моему, это не вполне нормально предлагать решить такую задачу на собеседовании. Просто тупое перебирание вариантов. Что оно говорит о кандидате?


 
Дельфятник   (2006-03-08 00:16) [82]

Ещё раз посмотрел на функцию, и нашёл неточность:

вместо

               FDate = nvl((select max(FDate) from TT_TEMP
                                 where Curr= pCurr and FDate <= pDate),
                                (select max(FDate) from TT_TEMP
                                 where Curr= pCurr)

должно быть просто

             FDate = (select max(FDate) from TT_TEMP
                         where Curr= pCurr and FDate <= pDate)


 
Жуков Олег   (2006-03-08 01:37) [83]

К чему такие сложности, это делается одним запросом. Синтаксис SQL не помню сейчас, но что-то типа такого должно быть

Select
 Rate
from
 Rates
where
 Date = (Select Max(Date) from Rates where Date <= @NecessaryDate)


 
paul_k ©   (2006-03-09 08:18) [84]

> [74] Romkin ©   (07.03.06 17:33)

если речь о MSSQL то божно и без, насколько помню...


> [81] Дельфятник   (08.03.06 00:06)

Чесслово - даже разговаривать не стал бы с вами после такого ответа на собеседовании.
Лучшебы сказали что не можете и спросили а как?
условие задачи - одним запросом
ответ - длиннючая процедура.
фи... Зачем нужен чел на работу, который не следует поставленной задаче?

Table
curensy_id id валюты
rate_value значение курса
rate_date дата курса

select top 1 rate_value
from table
where curency_id=@input_id
and rate_date <=@input date
order by rate_date desc


 
Bless ©   (2006-03-09 08:57) [85]


> Romkin ©   (07.03.06 17:33) [74]
>
> Bless ©   (07.03.06 16:40) [71] Кто такое сказал? Эссно,
>  его надо решать с подзапросом :))


Ну, не так уже и естесственно :)


DECLARE
@dat smalldatetime,
@valuta varchar(5)

SELECT @dat="9/06/2004", @valuta="USD"

SELECT top 1 * FROM T
WHERE valuta=@valuta AND dat<=@dat
ORDER BY @dat-dat



 
Bless ©   (2006-03-09 09:00) [86]


> paul_k ©   (09.03.06 08:18) [84]


:) Не видел, когда писал. Хотя
order by rate_date desc все же не правильно.


 
Bless ©   (2006-03-09 09:01) [87]


> order by rate_date desc все же не правильно.


Упс. Вру.


 
Romkin ©   (2006-03-09 12:01) [88]

Вопрос, собственно, был по стандарту SQL.
А там, по крайней мере в 92м, никаких топов. Так что правильный путь указан в [83] :)))  Я просто это не указал, а по теме ветки все поняли что это MSSQL.
Хотя, конечно, я понимаю, что все привыкли решать без подзапроса, тем или иным способом.
Почему по стандарту? Дык необязательно же придет человек, знающий тот сервер, что нужен. Главное - чтобы SQL знал.


 
paul_k ©   (2006-03-09 12:36) [89]

> [88] Romkin ©   (09.03.06 12:01)

Да понятно, что в ANSI-92 никаких топов нету. Но если чел хоть с TOP напишет то уже плюс.
кстати ещё интересный вопрос - какой из запросов быстрее при прочих равных. Есть подозрение, что стандартный (как у нас говорили - штатный) вариант.
да и способ приведенный в  [83] далеко не единственный.
Речь у меня, собственно, о том что если сказано в задании - запрос, то нада запрос а не процедуру.


> [82] Дельфятник   (08.03.06 00:16)

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

есть 500 складов. На каждом склаже примерно по 4000 наименований. По каждому товару есть данные - партия, когда поступил, валюта оплаты, цена единицы, количество
надо в отчете указать по каждому складу указать
наименование,
дату поступления,
стоимость в рублях на момент поступления,
стоимость в валюте на момент поступления
стоимость в рублях на момент ухода партии,
прибыль/убыток от курсовой разницы.

упрощение - партия товара приходит и уходит целиком


Это слегка упрощенный отчет. Собирают подобное обычно одним - несколькими запросами не используя циклов, курсоров и так далее.


 
Romkin ©   (2006-03-09 12:41) [90]

paul_k ©   (09.03.06 12:36) [89] А где записи об уходе-то? И чем отличаются? Стандартно, поле integer, -1 - уход, 1 - приход? Али как?


 
Fay ©   (2006-03-09 12:48) [91]

2 Romkin ©   (09.03.06 12:41) [90]
> -1 - уход, 1 - приход?
Нафиг? Положительное движения - приход 8)


 
Romkin ©   (2006-03-09 12:55) [92]

Положительное что? Количество или сумма? ;)
Нее, я не рискую, у меня именно отдельное поле на знак. Тем более 0 при этом работает, как служебные пометки. А умножить никогда не поздно


 
paul_k ©   (2006-03-09 12:57) [93]

> [90] Romkin ©   (09.03.06 12:41)

да хоть now  для всего уходом считать.
или как ты сказал +-1. без разницы
мsckz в том, что запустив подобный запрос используя может даже верный расчет из [82] на указанном небольшом наборе данных  можно спокойно уходить курить.
а если считать что подобные задачи я обрабатывал в обласи учета ценных бумаг, где не 100 валют а ******** котировок, а уход надо выбрать то по ЛИФО, то по ФИФО, то средневзвешенный, то можно и пообедать успеть легко.


 
paul_k ©   (2006-03-09 12:59) [94]

мsckz - мысль...


 
Brenagwynn   (2006-03-09 13:54) [95]

Насчет валют (пишу для оракла):
select * from (
select * from Rates
where currencycode = "USD"
and rate_date <= to_date("09032006","ddmmyyyy")
order by rate_date desc
)
where rownum = 1

Или так:
SELECT *
 FROM Rates vo
WHERE vo.currencycode = "USD"
  AND vo.rate_date =(
          SELECT MAX(vi.rate_date)
            FROM rates vi
           WHERE vi.currencycode = vo.currencycodecode
                 AND vi.rate_date <= TO_DATE("09032006", "ddmmyyyy"))


 
msguns ©   (2006-03-09 14:07) [96]

>Fay ©   (09.03.06 12:48) [91]
>Нафиг? Положительное движения - приход 8)

Надеюсь, это шутка ? Ибо убивець тот, кто так делает ;)


 
Polevi ©   (2006-03-09 14:37) [97]

>Дельфятник   (08.03.06 00:06) [81]
мдя, плохо дело


 
Romkin ©   (2006-03-09 14:47) [98]

Polevi ©   (09.03.06 14:37) [97] Да это еще терпимо :)))
http://www.sql.ru/forum/actualthread.aspx?bid=1&tid=12992



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

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

Наверх





Память: 0.78 MB
Время: 0.012 c
9-1128962305
JurMan
2005-10-10 20:38
2006.04.30
OnLine games


2-1144905410
Student iz KZ
2006-04-13 09:16
2006.04.30
Как производть локализацию приложения с помощью...


15-1144403920
Ega23
2006-04-07 13:58
2006.04.30
Случайно буду в Москве с ночёвкой.


2-1144910210
OlegOren
2006-04-13 10:36
2006.04.30
Создание не одной папки,а целого пути.


2-1145006273
elfebet
2006-04-14 13:17
2006.04.30
Как из строки program_#12345#.exe вырезать прочесть 123456





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский