powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / При UPDATE в рамках DirtyRead транзакции блокируется вся таблица?
13 сообщений из 13, страница 1 из 1
При UPDATE в рамках DirtyRead транзакции блокируется вся таблица?
    #32005833
v.v.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Делаю UPDATE TESTTABLE SET K = 10 WHERE TESTTABLE_ID = 10

Потом в другой тарнзакции делаю
UPDATE TESTTABLE SET K = 20 WHERE TESTTABLE_ID = 20

И последняя транзакция зависает.
...
Рейтинг: 0 / 0
При UPDATE в рамках DirtyRead транзакции блокируется вся таблица?
    #32005836
Fompro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, а sp_lock что говорит? И какой всё-таки TRANSACTION ISOLATION LEVEL
установлен?
...
Рейтинг: 0 / 0
При UPDATE в рамках DirtyRead транзакции блокируется вся таблица?
    #32005848
v.v.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уровень изоляции 0 (нулевой)
...
Рейтинг: 0 / 0
При UPDATE в рамках DirtyRead транзакции блокируется вся таблица?
    #32005849
v.v.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот что говорит sp_lock:

spid dbid ObjId IndId Type Resource mode status

54 7 706101556 0 TAB IX GRANT
54 7 706101556 0 RID 1:979:1 X GRANT
54 7 706101556 0 PAG 1:979 IX GRANT
54 7 706101556 0 RID 1:979:0 X GRANT
...
Рейтинг: 0 / 0
При UPDATE в рамках DirtyRead транзакции блокируется вся таблица?
    #32005853
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я все-таки настоятельно призываю изучать наследие классиков.
Из статьи "Microsoft SQL Server 7.0 - контрольная по безопасности":

В. К вам пришел продвинутый пользователь Саша, прослышавший про то, что в SQL Server 7.0 есть блокировки уровня записи, и в ультимативной форме потребовал, чтобы ему выдали на них права, потому что когда он на одном соединении делает
begin tran
update Auth with (rowlock) set au_lname = au_lname where au_id = '172-32-1176',
а на другом
select * from auth where au_id = '213-46-8915',
второй запрос подвисает, пока на первом соединении не сказать commit tran или rollback. Отсюда, по мысли Саши, неопровержимо следует, что SQL Server все равно блокирует не запись, а страницу несмотря на явный хинт. Ваши действия: а) grant rowlock on Auth to [Саша]; б) sp_addrolemember ‘db_lockadmins’, ‘Саша’; в) стартовать SQL Mail под профилем администратора и предложить Саше отправить сообщение c описанием проблемы, начинающееся словами «Дорогой SQL Server...»; г) create index auth_ix on Auth(au_id)?
О. г). Задача не имеет отношения к теме безопасности, так как блокировки являются внутренними объектами SQL Server и понятие прав пользователей для них не существует. После того, как проверены права пользователя на операцию, в ходе ее выполнения блокировки накладываются автоматически. В данном случае первый процесс действительно блокировал только одну запись (см. sp_lock), второй же останавливался из-за того, что не мог прочитать из нее поле au_id и проверить условие where для этой записи. После создания индекса он станет брать au_id из индексных страниц.
...
Рейтинг: 0 / 0
При UPDATE в рамках DirtyRead транзакции блокируется вся таблица?
    #32005863
v.v.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Во-первых, не понял при чем здесь права пользователей.
Второе, уровень изоляции транзакции - нулевой, а следовательно данные из таблицы должны читаться свободно.
Я отличаюсь от Саши тем, что после begin tran я делаю set transaction isolation level read uncommitted
...
Рейтинг: 0 / 0
При UPDATE в рамках DirtyRead транзакции блокируется вся таблица?
    #32005872
Ivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А действительно интересно!

Следующая конструкция у меня работает (в соответствущем контексте):
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
SELECT * FROM TESTTABLE TESTTABLE_ID=10

А вот эта уже нет (в том же контексте):
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
UPDATE TESTTABLE SET K = 20 WHERE TESTTABLE_ID = 20

Можно так:
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
UPDATE TESTTABLE SET K = 20 FROM TESTTABLE WITH(readpast) WHERE TESTTABLE_ID = 20

но я не уверен, что это хорошо (хотя все работет правильно).
...
Рейтинг: 0 / 0
При UPDATE в рамках DirtyRead транзакции блокируется вся таблица?
    #32005873
Ivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь, не SELECT * FROM TESTTABLE TESTTABLE_ID=10, a SELECT * FROM TESTTABLE TESTTABLE_ID=20
...
Рейтинг: 0 / 0
При UPDATE в рамках DirtyRead транзакции блокируется вся таблица?
    #32005874
Ivan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тьфу блин!!! Теперь WHERE потерялся. В обшем главное не форма, а смысл.
...
Рейтинг: 0 / 0
При UPDATE в рамках DirtyRead транзакции блокируется вся таблица?
    #32005875
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED - естественно, учитывается только при чтении.
При упдейтах блокировки должны быть по определению.
Другое дело, почему не срабатывает блокировка на запись - но это наверное из-за индексов.
...
Рейтинг: 0 / 0
При UPDATE в рамках DirtyRead транзакции блокируется вся таблица?
    #32005891
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Во-первых, не понял при чем здесь права пользователей"
Во-первых, права пользователей здесь при том, что статья д-но была посвящена безоп-ти. А поск. в отл. от авторов толстых книг я не пересказываю BOL, а беру реальные ситуации, то в моей прошлой жизни такой случай реально имел место. Т.е. пришел один перец, типа продвинутый юзер, и пытался продемонстрировать свои познания, полученные после прочтения толстой книги.
"Я отличаюсь от Саши тем, что ..."
Во-вторых. Не надо искать в моих словах параллели. Статья написана полтора года назад, и я не хотел совпадениями задеть кого-л. из присутствующих здесь сейчас.
"Второе, уровень изоляции транзакции - нулевой, а следовательно данные из таблицы должны читаться свободно."
В-третьих, не надо быть американским стюдентом. Стоит иногда давать себе труд подумать самому. Напр., почему работает вот так:
1-я сессия:
set transaction isolation level read uncommitted
begin tran
update Auth with (rowlock) set au_lname = au_lname where au_id = '172-32-1176'
2-я сессия:
set transaction isolation level read uncommitted
select * from auth where au_id = '213-46-8915'
и не работает, если на 2-м коннекте вместо select поставить update Auth with (rowlock) set au_lname = au_lname where au_id = '213-46-8915'
PS. AlexeyVG прав. Прочтите еще раз опр-е "грязного чтения".
...
Рейтинг: 0 / 0
При UPDATE в рамках DirtyRead транзакции блокируется вся таблица?
    #32005892
Фотография Дед Маздай
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PPS. set transaction isolation level в 1-ю сессию попал случайно. Сов.очев., что он там не нужен.
...
Рейтинг: 0 / 0
При UPDATE в рамках DirtyRead транзакции блокируется вся таблица?
    #32005893
v.v.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот мне и нужен был ответ как у AlexeyVG.

Спасибо.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / При UPDATE в рамках DirtyRead транзакции блокируется вся таблица?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]