Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.12.30;
Скачать: [xml.tar.bz2];

Вниз

Блокировка таблиц в MS SQL.   Найти похожие ветки 

 
Emfi   (2002-12-09 19:10) [0]

Работаю через ADO с MS SQL сервером. Пользуюсь TBetterADO компонентами. Возикает следующая ситуация: как только стартую транзакцию и вношу какое-то изменение таблица в которой поменялось хотя бы одно поле в единственной записи блокируется. Ее не удается даже прочитать.
ADODataSet открыт в режиме ReadWrite. Уровень изоляции транзакций любой (эффект не изменяется). LockType - optimistic.
Курсор клиентский и Statiс.
Как бороться, если это возможно? Режим ReadWrite снимать нельзя.


 
sniknik   (2002-12-09 19:42) [1]

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
перед чтением, блокироватся не булет. (но риск на непринятых транзакциях выводы делать)


 
Emfi   (2002-12-10 09:01) [2]

К сожалению, этот вариант тоже не проходит. Не понятно почему блокируется ВСЯ ТАБЛИЦА. MS SQL разве не умеет блокировать отдельную запись ?


 
Anatoly Podgoretsky   (2002-12-10 09:21) [3]

MS SQL разные бывают


 
Fiend   (2002-12-10 10:00) [4]

есть разные типы блокировок. но они внутрисерверные. Т.е. ваш АДО компонент и не знает о их существовании. Если бы вы пользовались всеми версиями MS SQL , а это 6.5-7.0-2000(8.0), то вы бы заметили по характеристикам продукта, что в версии 2000, уже есть и строчные блокировки, а до этого были и табличные и страничные, и вы конечно не можете ими управлять, т.е. сервер сам решает как нужно блокировать данные. Ну в общем смысл такой, если надо прочесть данные из таблицы, которая заблокирована не важно каким способом, то есть такая фишка:
select * from ATable with(nolock).прочтёт не смотря ни на что, т.е. транзакции явные и неявные вас не остановят.
УДАЧИ!


 
Emfi   (2002-12-10 10:32) [5]

Уточняю - MS SQL 2000 и тем не менее по записям не блокирует - только целиком всю таблицу. А насчет блокировок записей похоже, что все-таки провайдер тут прикладыват руку а не сервер. За фишку "with(nolock)" огромное спасибо, действительно работает. Получился действительно optimistic. Если MS SQL научился блокировать записи только в последней своей версии, то это совсем не здорово.
В документации нашлись эти опции, а сначала я на них и внимания не обратил, точнее не там искал.


 
Азазелло   (2002-12-10 12:36) [6]

А если меня интересует не только чтение? как дела обстоят с этим?

С уважением, Игорь


 
Азазелло   (2002-12-10 13:05) [7]

речь идет об MSSQL 2000..

с nolock после удаления записей в кросс таблице, если транзакция сразу не коммитится (а я не могу её сразу коммитить)на других клиентах при попытке добавления в эту кросстаблицу betterADO датасет анализирует и ждет снятия блокировки, соответственно слетает по таймауту.. как с этим жить?

С уважением, Игорь.


 
Fiend   (2002-12-10 15:55) [8]

То Азазелло
Забудьте о том что провайдер делает блокировки. Это чушь полная!

Блокирует всегда сервер и только сервер, через какую бы вы там ху.....ню не обратились к нему. Кто же станет переносить сложнейшую логику сервера (в частности блокировки) в провайдера?! Это абсурд.
А насчёт записи: Ни один порядочный сервер, в жизни вам не даст выполнить одновременный UPDATE для одних и тех же данных. Хотя возможен вариант, что в процессе обновления, сервер заблокирует только например 5 страницу таблицы, а какой то другой запрос вызовет блокировку 10 страницы данных. Эти запросы выполнятся и не заблокируют друг друга


 
Азазелло   (2002-12-10 18:06) [9]

To Fiend ©

Что значит не даст? Если переходить на термины "порядочные сервера" - в Interbase нет блокировок, поскольку он версионник и lock идет только в момент попытки коммита транзакции, насколько я знаю и Oracle сейчас декларирует это.. а вот MS получается полный блокировочник : (

И в данном случае речь идет не о странице или таблице. Почему, когда работа идет с одной конкретной записью происходит блокировка всех записей таблицы? блокировка записи, с которой идет работа - это одно.. а всех...

С уважением, Игорь.


 
Fiend   (2002-12-10 18:29) [10]

То Азазелло
тип блокировки устанавливается человеком который пишет запрос на Update, тама есть опции. Но если сервер всё же решит шо человек неверно написал или не указал ваще ничего, то лочится вся таблица.

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

С Уважением, Fiend


 
Fiend   (2002-12-10 18:31) [11]

и кстати можете ваще сказать ему опциями, мол не блокируй ничего.
но тогда сам будеш отвечать за то шо получится. И это правильно!!!

Уважением, Fiend


 
Emfi   (2002-12-10 18:34) [12]

По поводу провайдера уточню, чтобы не было непонимания. Он передает серверу флаги и параметры, которыми должен руководствоваться сервер при работе с коннектом (или сессией), т.е. дает своего рода рекоммендации, а механизм реализуется разумеется сервером (с этим никто не спорит, т.к. если это будет делать провайдер, то на кой вообще и сервер ...). Если провайдер в параметрах не будет "настаивать", что ему неприемлима блокировка таблиц целиком, то сервер такую блокировку сделает, а если будет, то по крайней мере должен попробовать избежать подоюной ситуации (уж если не получилось, то блокировать). Вот что имелось ввиду под участием провайдера.
В моем случае правильным было бы блокировать записи (потому как у пишущих наборов данных установлен "оптимистичный" режим блокировки), которые были изменены в процессе выполнения транзакции, а не всю таблицу (причем на запись, а чтение предоставлять в соответствии с уровнем изоляции транзакций).
Oracle так себя и ведет. MS SQL 2000 так же должен уметь блокировать не только блоками и таблицами (что и файл-сервера умеют), но и записями, чего не происходит. Значит либо в действительности он этого не умеет, либо я задаю не правильные настройки, что наиболее вероятно.
Использование with(nolock) частично решило проблему и я могу считывать данные (кстати появление там незакоммиченных записей не очень желательно, но что терпимо), но я очень расчитывал на возможность записи: запись не откоммичена, уровень изоляции readcommited - ее даже видеть никто не должен был.
Почему же все-таки идет блокировка всей таблицы из-за одной незакоммиченной записи ?


 
Азазелло   (2002-12-10 18:42) [13]

Спасибо за поучения.. вот только где бы поподробнее почитать об этих самых опциях? (стандартный MSSQL-евский онлайновый бук не предлагать, лучше если есть возможность дать ссылочку на какой-нибудь родной урл или на книжку, которую можно купить и читать в метро или кратко поделиться здесь)к сожалению в апдейт ничего засунуть не могу, поскольку его делает BetterADODataSet, только через настройки ADOConnection (да и то они бедноватые и отчего-то не все работают, не смотня на все апдейты). Уровень изоляции ReadUncommited приходится через ADOCommand выставлять..

С уважением, Игорь.


 
Fiend   (2002-12-11 10:02) [14]

То Emfi
поддерживаю про провайдера, я в общем тоже хотел сказать. А вот дальше для двоих:

То Emfi и Азазелло
Уровень блокировок можно и надо устанавливать не только во время select!!!
Для INSERT и UPDATE можно сделать тоже самое. И ваще я честно говоря сторонник того чтобы не какими то там неведомыми опциями провайдера устанавливать параметры запросов а именно ручками их прописывать, т.е. делать так update aaa with (rowlock) set a=1 where b=123.

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

То Азазелло
Я канечна извиняюсь, но я всё читаю из BOL. Где взять урл или более подробно не знаю. Там в общем нормально написано. Ну если уж что то очень не понятно, то пишите мылом или стучитесь в асю. Чем смогу помогу.

С уважением Fiend



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

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

Наверх





Память: 0.49 MB
Время: 0.009 c
3-98994
nadin
2002-12-10 14:35
2002.12.30
DBase или ?


3-98958
moorcat
2002-12-09 13:17
2002.12.30
Сортировка


1-99121
Krasuk
2002-12-17 17:40
2002.12.30
FontDialog


14-99336
Malder
2002-12-10 19:13
2002.12.30
Обзор интернет магазинов


7-99387
Начинающий програмер
2002-08-26 19:58
2002.12.30
температура процессора





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