Re[11]: Вопрос про одновременный доступ
От: 191540 Россия  
Дата: 19.05.06 19:22
Оценка:
Здравствуйте, 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


Существует русское издание
Re[10]: Вопрос про одновременный доступ
От: MASReady  
Дата: 19.05.06 19:56
Оценка:
Здравствуйте, Sinclair, Вы писали:

...
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 и получать от нее курсор, а уже из курсора потом вытягиваю переменную...

как-то это все кривовато, но по другому не получилось, а из проги как-то не хочется каждый раз запросом это дело доставать...

если можешь напиши подробнее свои измышления по поводу пользователя и компа с которого заблокирована запись...
Re[12]: Вопрос про одновременный доступ
От: MASReady  
Дата: 19.05.06 20:19
Оценка:
Здравствуйте, 191540:

Спасибо за совет!
То, что нужно знать — это понятно и бесспорно!!!
Но у меня не было ни книг, ни времени, ни даже инет трафа, чтобы скачать books online но к счастью у меня есть MSDN там в принципе можно накопать какой-никакой материал, правда он от января 2006 и про SQL server 2005 и его особенности там мало, но основные функции там описаны, но естественно нужна не только справочная информация, сколько грамотно построенный учебник нацеленный как-раз на постижение "всей глубины наших глубин"
И при всем этом у меня есть достаточно глубокие знания в различных языках программирования которые и помогли мне в короткие сроки разобраться с этим делом и написать работающую прогу, которая в принципе удовлетворяет поставленным требованиям.
Но так как действовать пришлось больше по интуиции и по аналогии с другими языками, то скорей всего не обойденных "подводных камней" осталось немало, посему буду изучать и читать, постараюсь найти указанные тобой книжки...

Хочу еще, если запись уже заблокирована другим экемпляром моего приложения получить имя пользователя и комп с которых это было сделано... сейчас над этим и работа... причем хочу сделать основываясь на возможностях сервака, а не на его доработке...
Я сначала механизм отслеживания изменения записи за время редактирования сделал при помощи своего поля, но с этим было гораздо больше мороки, чем с использованием timestamp-поля...
Я так думаю писаль сервак не дураки и многое, тем более такие первостепенные вещи давно реализованы, нужно знать как...
Многие вещи по MS SQL нашел на этом форуме...

Еще раз спасибо!!!
Re[9]: Вопрос про одновременный доступ
От: Sinclair Россия https://github.com/evilguest/
Дата: 21.05.06 08:05
Оценка: 2 (1)
Здравствуйте, individual, Вы писали:
I>Я хотел узнать следующее. В клиентском приложении происходят события типа connect, begin transaction, отправка SQL-запроса, disconnect. В какой момент я определяю, какая у меня будет блокировка и как?
По-разному. Вот, к примеру, для interbase ты выбираешь оптимистичные блокировки сразу при выборе СУБД. Для MS SQL 2000 — ты выбираешь пессимистичные при выборе СУБД. Для MS SQL 2005 ты выбираешь режим в любой момент перед каждой транзакцией.
Судя по всему, ты задаешь не те вопросы, ответы на которые тебе нужны. Постарайся задать более развернутый вопрос.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[9]: Вопрос про одновременный доступ
От: Sinclair Россия https://github.com/evilguest/
Дата: 21.05.06 08:05
Оценка:
Здравствуйте, 191540, Вы писали:

1>Если говорить о методе реализации (Какой ресурс блокирует и когда)

1>то это свойство сервера
Не обязательно. MS SQL 2005 поддерживает как pessimistic, так и optimistic locking.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[10]: Вопрос про одновременный доступ
От: individual Россия  
Дата: 21.05.06 21:19
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>По-разному. Вот, к примеру, для interbase ты выбираешь оптимистичные блокировки сразу при выборе СУБД. Для MS SQL 2000 — ты выбираешь пессимистичные при выборе СУБД. Для MS SQL 2005 ты выбираешь режим в любой момент перед каждой транзакцией.

S>Судя по всему, ты задаешь не те вопросы, ответы на которые тебе нужны. Постарайся задать более развернутый вопрос.

Вовсе нет! Вы с 191540 ответили именно на то, что я спрашивал!

А если более развёрнуто, то интересно узнать ещё следующее. Ты писал про три типа пессимистичных блокировок: Shared, Update, Exclusive. Их я тоже волен выбирать сам? Т.е. я могу сам выбрать, что заблокировать (какие таблицы или их части) и в каком режиме? Если да, то как это делается, например, в MS SQL или в Oracle?

И ещё: можно ли выбирать типы блокировок в Oracle (по умолчанию, я так понимаю, там оптимистичные блокировки)?
Re[9]: Вопрос про одновременный доступ
От: individual Россия  
Дата: 21.05.06 23:53
Оценка:
Здравствуйте, 191540, Вы писали:

1>Смотря что понимается под словом "виды"


Здесь я имел в виду модель optimistic locking или pessimistic locking.

1>Если говорить о методе реализации (Какой ресурс блокирует и когда)

1>то это свойство сервера
Re[11]: Вопрос про одновременный доступ
От: Блудов Павел Россия  
Дата: 22.05.06 01:02
Оценка:
Здравствуйте, individual, Вы писали:

I>И ещё: можно ли выбирать типы блокировок в Oracle (по умолчанию, я так понимаю, там оптимистичные блокировки)?

Фраза "типы блокировок в Oracle" лишина смысла. Oracle это версионник, а не блокировочник. Там всё совсем по-другому.
... << RSDN@Home 1.2.0 alpha rev. 642>>
Re[11]: Вопрос про одновременный доступ
От: Sinclair Россия https://github.com/evilguest/
Дата: 22.05.06 01:46
Оценка: 1 (1)
Здравствуйте, individual, Вы писали:
I>А если более развёрнуто, то интересно узнать ещё следующее. Ты писал про три типа пессимистичных блокировок: Shared, Update, Exclusive. Их я тоже волен выбирать сам? Т.е. я могу сам выбрать, что заблокировать (какие таблицы или их части) и в каком режиме? Если да, то как это делается, например, в MS SQL или в Oracle?
В определенных пределах — да. Напрямую, естественно, никакого управления нет. Но есть хинты, которые могут заставить изменить стратегию выдачи блокировок во время исполнения запроса. Крайне не рекомендую ими пользоваться. Единственное исключение — UPDLOCK, о нем догадаться оптимизатор не может.
I>И ещё: можно ли выбирать типы блокировок в Oracle (по умолчанию, я так понимаю, там оптимистичные блокировки)?
Там оптимистичные блокировки на чтение, но, насколько я знаю, на модификацию там ставятся пессимистичные блокировки.
1.1.4 stable rev. 510
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[10]: Вопрос про одновременный доступ
От: 191540 Россия  
Дата: 23.05.06 15:36
Оценка:
Здравствуйте, 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) Вообщето я имел ввиду какие обьекты СУБД затрагивает та или иная блокировка
(важно для понимания Эскалации, например) и какие же собственно блокировки вызывает
та или иная операция (помогает при оптимизации)


P/S

Не спора, а истины ради...
Re[12]: Вопрос про одновременный доступ
От: 191540 Россия  
Дата: 23.05.06 15:42
Оценка: 1 (1) +1
Здравствуйте, Блудов Павел, Вы писали:

БП>Здравствуйте, individual, Вы писали:


I>>И ещё: можно ли выбирать типы блокировок в Oracle (по умолчанию, я так понимаю, там оптимистичные блокировки)?

БП>Фраза "типы блокировок в Oracle" лишина смысла. Oracle это версионник, а не блокировочник. Там всё совсем по-другому.

И "Да" и "Нет"

1) Да, действительно основная идея в Oracle это Multiversion concurrency control
2) Но это не всегда избавляет от блокировок. Достаточно посмотреть на

SELECT ... FOR UPDATE ...


3) Во многих СУБД есть несвойственные их каждодневному
способу использования средства для совместимости с др
СУБД
Re[11]: Вопрос про одновременный доступ
От: GlebZ Россия  
Дата: 23.05.06 16:21
Оценка:
Здравствуйте, 191540, Вы писали:

1>Есть упоминание, что optimistic concurrency control поддерживается в

1>MS SQL 2000 , но никаких примеров подтверждающих это я так и не нашел.
1>Я отношу это заявление на неточность в документации.
Это заявление касалось MSSQL 2005.здесь
Автор(ы): Иван Бодягин
Дата: 16.07.2004
Статья рассказывает о поддержке версионности, которая должна появиться в новой версии MS SQL Server — Yukon.
. Но в принципе, до определенного уровня изоляции, оптимистические блокировки можно построить вручную.
Re[11]: Вопрос про одновременный доступ
От: GlebZ Россия  
Дата: 23.05.06 19:00
Оценка: 2 (1)
Здравствуйте, 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.
Re[11]: Вопрос про одновременный доступ
От: Merle Австрия http://rsdn.ru
Дата: 23.05.06 19:49
Оценка: +1
Здравствуйте, 191540, Вы писали:

1>Кто знает — подскажите !!

У тебя вопросы... очень глобальные. Отвечать подробно — потянет на хорошую статью, да и не на одну. Отвечать буквально — будет либо неправильно, либо непонятно... Поэтому давай так, спрашивай не "что это за фича?", а "мне надо решить такую-то задачу.."
... [RSDN@Home 1.2.0 alpha rev. 619]
Мы уже победили, просто это еще не так заметно...
Re[6]: Вопрос про одновременный доступ
От: ZAMUNDA Земля для жалоб и предложений
Дата: 23.05.06 22:40
Оценка: 2 (1)
В дополнение к сказанному Sinclair, матчасть: здесь
Автор(ы): Иван Бодягин
Дата: 05.05.2004
В статье рассматривается проблема взаимоблокировок, даются примеры успешного создания подобных ситуаций, а также их разрешения. Материал разбирается на примере MS SQLServer 2000.

и здесь
Автор(ы): Иван Бодягин
Дата: 03.11.2003
В этом небольшом Q&A рассматривается «проблема» эскалации блокировок (lock escalation). Слово «проблема» намеренно взято в кавычки, так как на самом деле это никакая не проблема, а достаточно остроумное решение других потенциальных проблем. Сначала я попытаюсь объяснить, что же такое эскалация и для чего она предназначена, а потом будет разобрана реализация эскалации блокировок в Microsoft SQL Server 2000.
Наука изощряет ум; ученье вострит память.
(c) Козьма Прутков
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.