Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Страницы:   1 2 3 4 5

Дельфятник ©   (2006-03-06 18:29:00) 

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-07 12:38:00) [61]

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


msguns   (2006-03-07 12:36:00) [62]

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

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

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


Nikolay M.   (2006-03-07 12:35:00) [63]


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


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


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

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


ANB   (2006-03-07 12:26:00) [65]


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

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


Romkin   (2006-03-07 12:24:00) [66]

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


Fay   (2006-03-07 12:17:00) [67]

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


Nikolay M.   (2006-03-07 12:11:00) [68]


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


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


Sergey13   (2006-03-07 12:01:00) [69]

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


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

Случайно обнаружил обсуждение наших тестов
Итак: Вопрос про корректное завершение транзакции
Вопрос был расчитан на то, понимает ли человек что сначала надо откатывать транзакции, а уж потом вызывать обработку ошибок и сообщений пользователю.
Краткий текст вопроса: Что выбрать а) или б)
а)
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


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

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


msguns   (2006-03-07 11:37:00) [72]

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

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

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

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

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


Val   (2006-03-07 10:57:00) [73]

>msguns ©   (07.03.06 09:31)

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

пример чего?

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


msguns   (2006-03-07 09:54:00) [74]

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

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


msguns   (2006-03-07 09:47:00) [75]

>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:31:00) [76]

>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 к примеру, работа через буферы изменений, клиентский датасет с механизмом "пакетных" изменений..) заложена именно разработчиками дельфи (точнее, компонент БД) и носит признаки определенной стратегии.


evvcom   (2006-03-07 09:08:00) [77]

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


ANB   (2006-03-06 23:36:00) [78]


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

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

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


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


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


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

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


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


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


Nikolay M.   (2006-03-06 23:10:00) [80]

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


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


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

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


Страницы:   1 2 3 4 5

Наверх

Титульная страница Поиск, карта сайта Написать письмо