Здравствуйте, MASReady, Вы писали:
MAS>Здравствуйте, Sinclair, Вы писали:
S>>Здравствуйте, MASReady, Вы писали:
S>>Уехал в командировку, отвечу как вернусь.
MAS>Ай как жалко
MAS>посоветуйте книжечку или где порыться в инете, мож сам разберусь, мне за несколько дней нужно все сделать
Нужно знать возможности СУБД под которую программируешь,
это не только я так считаю — известный эксперт по Oracle
Том Кайт того же мнения
Так что читать нужно Books Online к MS SQL 2005
Или доку по MS SQL 2000
Например:
MCAD/MCSE/MCDBA Self-Paced Training Kit: Microsoft SQL
Server 2000 Database Design and Implementation, Exam 70-229,
Это довольно простое описание.
Существует русское издание
+ что-то типа
A First Look at SQL Server 2005 for Developers
by Bob Beauchemin,Niels Berglund,Dan Sullivan
(ISBN: 0-321-18059-3)
Для твоей задачи IMHO эта книга имеет смысл если будешь
заморачиваться с версионностью
ПО T-SQL рекомендую:
Henderson, Kenneth W.The guru's guide to Transact-SQL
... MAS>>Как узнать была ли изменена запись с того момента как юзверь начал ее тиранить S>Для этого к таблице нужно добавить поле типа timestamp. Оно всегда меняется при изменении записи. MAS>>и если да, то кем (что нужно доработать и как это лучше сделать)??? S>Нет, этого сделать нельзя. Доработать можно при помощи триггера, который запишет в нужное место значение DATABASE_PRINCIPAL_ID()
...
спасибо за ответ!!!
Я в принципе со всем разобрался кроме получении имени пользователя который заблокировал запись и компутера с которого он это сделал, сейчас над этим и работаю...
единственная проблема была с созданием процедуры, которая по имени таблицы (@tablename) и уникальному @ID записи должна была вернуть timestamp-поле, у меня не получалось сделать запрос указывая в запросе имя таблицы при помощи переменной (входного параметра) @tablename(//*--SELECT TOP 1 @SYSROWCHANGED=SYSROWCHANGED FROM @tablename WHERE ID=@id--*//), оказывается на языке MS SQL надо явно указывать имя таблицы, ну или я что-то недопонял... пришлось делать по другому: формировать строку запросапередавать ее в sp_executesql и получать от нее курсор, а уже из курсора потом вытягиваю переменную...
как-то это все кривовато, но по другому не получилось, а из проги как-то не хочется каждый раз запросом это дело доставать...
если можешь напиши подробнее свои измышления по поводу пользователя и компа с которого заблокирована запись...
Спасибо за совет!
То, что нужно знать — это понятно и бесспорно!!!
Но у меня не было ни книг, ни времени, ни даже инет трафа, чтобы скачать books online но к счастью у меня есть MSDN там в принципе можно накопать какой-никакой материал, правда он от января 2006 и про SQL server 2005 и его особенности там мало, но основные функции там описаны, но естественно нужна не только справочная информация, сколько грамотно построенный учебник нацеленный как-раз на постижение "всей глубины наших глубин"
И при всем этом у меня есть достаточно глубокие знания в различных языках программирования которые и помогли мне в короткие сроки разобраться с этим делом и написать работающую прогу, которая в принципе удовлетворяет поставленным требованиям.
Но так как действовать пришлось больше по интуиции и по аналогии с другими языками, то скорей всего не обойденных "подводных камней" осталось немало, посему буду изучать и читать, постараюсь найти указанные тобой книжки...
Хочу еще, если запись уже заблокирована другим экемпляром моего приложения получить имя пользователя и комп с которых это было сделано... сейчас над этим и работа... причем хочу сделать основываясь на возможностях сервака, а не на его доработке...
Я сначала механизм отслеживания изменения записи за время редактирования сделал при помощи своего поля, но с этим было гораздо больше мороки, чем с использованием timestamp-поля...
Я так думаю писаль сервак не дураки и многое, тем более такие первостепенные вещи давно реализованы, нужно знать как...
Многие вещи по MS SQL нашел на этом форуме...
Здравствуйте, individual, Вы писали: I>Я хотел узнать следующее. В клиентском приложении происходят события типа connect, begin transaction, отправка SQL-запроса, disconnect. В какой момент я определяю, какая у меня будет блокировка и как?
По-разному. Вот, к примеру, для interbase ты выбираешь оптимистичные блокировки сразу при выборе СУБД. Для MS SQL 2000 — ты выбираешь пессимистичные при выборе СУБД. Для MS SQL 2005 ты выбираешь режим в любой момент перед каждой транзакцией.
Судя по всему, ты задаешь не те вопросы, ответы на которые тебе нужны. Постарайся задать более развернутый вопрос.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, 191540, Вы писали:
1>Если говорить о методе реализации (Какой ресурс блокирует и когда) 1>то это свойство сервера
Не обязательно. MS SQL 2005 поддерживает как pessimistic, так и optimistic locking.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>По-разному. Вот, к примеру, для interbase ты выбираешь оптимистичные блокировки сразу при выборе СУБД. Для MS SQL 2000 — ты выбираешь пессимистичные при выборе СУБД. Для MS SQL 2005 ты выбираешь режим в любой момент перед каждой транзакцией. S>Судя по всему, ты задаешь не те вопросы, ответы на которые тебе нужны. Постарайся задать более развернутый вопрос.
Вовсе нет! Вы с 191540 ответили именно на то, что я спрашивал!
А если более развёрнуто, то интересно узнать ещё следующее. Ты писал про три типа пессимистичных блокировок: Shared, Update, Exclusive. Их я тоже волен выбирать сам? Т.е. я могу сам выбрать, что заблокировать (какие таблицы или их части) и в каком режиме? Если да, то как это делается, например, в MS SQL или в Oracle?
И ещё: можно ли выбирать типы блокировок в Oracle (по умолчанию, я так понимаю, там оптимистичные блокировки)?
Здравствуйте, 191540, Вы писали:
1>Смотря что понимается под словом "виды"
Здесь я имел в виду модель optimistic locking или pessimistic locking.
1>Если говорить о методе реализации (Какой ресурс блокирует и когда) 1>то это свойство сервера
Здравствуйте, individual, Вы писали:
I>И ещё: можно ли выбирать типы блокировок в Oracle (по умолчанию, я так понимаю, там оптимистичные блокировки)?
Фраза "типы блокировок в Oracle" лишина смысла. Oracle это версионник, а не блокировочник. Там всё совсем по-другому.
Здравствуйте, individual, Вы писали: I>А если более развёрнуто, то интересно узнать ещё следующее. Ты писал про три типа пессимистичных блокировок: Shared, Update, Exclusive. Их я тоже волен выбирать сам? Т.е. я могу сам выбрать, что заблокировать (какие таблицы или их части) и в каком режиме? Если да, то как это делается, например, в MS SQL или в Oracle?
В определенных пределах — да. Напрямую, естественно, никакого управления нет. Но есть хинты, которые могут заставить изменить стратегию выдачи блокировок во время исполнения запроса. Крайне не рекомендую ими пользоваться. Единственное исключение — UPDLOCK, о нем догадаться оптимизатор не может. I>И ещё: можно ли выбирать типы блокировок в Oracle (по умолчанию, я так понимаю, там оптимистичные блокировки)?
Там оптимистичные блокировки на чтение, но, насколько я знаю, на модификацию там ставятся пессимистичные блокировки.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Sinclair, Вы писали:
S>Здравствуйте, 191540, Вы писали:
1>>Если говорить о методе реализации (Какой ресурс блокирует и когда) 1>>то это свойство сервера S>Не обязательно. MS SQL 2005 поддерживает как pessimistic, так и optimistic locking.
Вы меня не поняли.
1) pessimistic и optimistic locking это несколько иное. Это виды concurrency control[b]
2) То что Вы назвали действительно свойство сервера. так например мне не известно
о поддержке optimistic concurrency control в [b]MS SQL 2000
В Books Online и в MCAD/MCSE/MCDBA Self-Paced Training Kit: Microsoft SQL
Server 2000 Database Design and Implementation, Exam 70-229, Second Edition.
Есть упоминание, что optimistic concurrency control поддерживается в
MS SQL 2000 , но никаких примеров подтверждающих это я так и не нашел.
Я отношу это заявление на неточность в документации.
Кто знает — подскажите !!
3) Вообщето я имел ввиду какие обьекты СУБД затрагивает та или иная блокировка
(важно для понимания Эскалации, например) и какие же собственно блокировки вызывает
та или иная операция (помогает при оптимизации)
Здравствуйте, Блудов Павел, Вы писали:
БП>Здравствуйте, individual, Вы писали:
I>>И ещё: можно ли выбирать типы блокировок в Oracle (по умолчанию, я так понимаю, там оптимистичные блокировки)? БП>Фраза "типы блокировок в Oracle" лишина смысла. Oracle это версионник, а не блокировочник. Там всё совсем по-другому.
И "Да" и "Нет"
1) Да, действительно основная идея в Oracle это Multiversion concurrency control
2) Но это не всегда избавляет от блокировок. Достаточно посмотреть на
SELECT ... FOR UPDATE ...
3) Во многих СУБД есть несвойственные их каждодневному
способу использования средства для совместимости с др
СУБД
Здравствуйте, 191540, Вы писали:
1>Есть упоминание, что optimistic concurrency control поддерживается в 1>MS SQL 2000 , но никаких примеров подтверждающих это я так и не нашел. 1>Я отношу это заявление на неточность в документации.
Это заявление касалось MSSQL 2005.здесь
Здравствуйте, individual, Вы писали:
I>И ещё: можно ли выбирать типы блокировок в Oracle (по умолчанию, я так понимаю, там оптимистичные блокировки)?
Все несколько по другому. В Oracle используются пессимистические блокировки в основном внутренними механизмами. Oracle умеет сохранять консистентность в течении одного запроса что весьма пользительное свойство.
На момент запроса select, таблицу которую он затрагивает, блокируется shared блокировкой. Это защищает от изменения читаемых данных (но не блокирует другое чтение). После чтения, блокировка снимается.
На момент запроса insert, update или delete на таблицу накладывается блокировка shared row exclusive, а на строку exclusive. Это защищает таблицу от операций чтения, и операций DDL. Строку защищает от любого изменения. После изменения, блокировка снимается.
В случае операции DDL, ставится эксклюзивная блокировка на всю таблицу.
Есть некоторые исключения связанные с ссылочной целостностью, но в принципе все так.
На таблицы можно ставить блокировки самому (операция Lock Table).
На строки можно ставить только exclusive блокировки с помощью select ... for update. Но так как в Oracle неблокирующее чтение, то есть, блокировки на уровне строк при чтении никак не учитывается, то поведение отлично от блокировочников. select ... for update защищает только от операций update, delete, процедур DML, и других select ... for update.
Здравствуйте, 191540, Вы писали:
1>Кто знает — подскажите !!
У тебя вопросы... очень глобальные. Отвечать подробно — потянет на хорошую статью, да и не на одну. Отвечать буквально — будет либо неправильно, либо непонятно... Поэтому давай так, спрашивай не "что это за фича?", а "мне надо решить такую-то задачу.."