Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 старые, добрые блокировки  [new]
virus_system
Member

Откуда: Ульск
Сообщений: 624
Подскажите пож-ста, как заблокировать записи....


У меня есть довольно большой запрос типа
update t set c = 5 where id = 3
update t set c = 9 where id = 5
update t set c = 8 where id = 5
update t set c = 7 where id = 6
update t set c = 6 where id = 45
....

и есть запрос
update t set c = 9 where id = 6

Как мне в первом запросе заблокировать записи, чтобы во втором они выполнились только после выполнения первого???
31 авг 11, 10:51    [11204555]     Ответить | Цитировать Сообщить модератору
 Re: старые, добрые блокировки  [new]
iljy
Member

Откуда:
Сообщений: 8711
virus_system
Подскажите пож-ста, как заблокировать записи....


У меня есть довольно большой запрос типа
update t set c = 5 where id = 3
update t set c = 9 where id = 5
update t set c = 8 where id = 5
update t set c = 7 where id = 6
update t set c = 6 where id = 45
....

и есть запрос
update t set c = 9 where id = 6

Как мне в первом запросе заблокировать записи, чтобы во втором они выполнились только после выполнения первого???

Не очень понятно, чего вы хотите. Нет способа задать порядок выполнгения запросов в разных сессиях, кто раньше - тот и выполнится. Можно конечно наложить блокировку на всю таблицу и держать до конца транзакции, но сразу возникает вопрос - нафига?
31 авг 11, 10:58    [11204581]     Ответить | Цитировать Сообщить модератору
 Re: старые, добрые блокировки  [new]
Запросий
Guest
virus_system
Подскажите пож-ста, как заблокировать записи....


У меня есть довольно большой запрос типа
update t set c = 5 where id = 3
update t set c = 9 where id = 5
update t set c = 8 where id = 5
update t set c = 7 where id = 6
update t set c = 6 where id = 45
....

и есть запрос
update t set c = 9 where id = 6

Как мне в первом запросе заблокировать записи, чтобы во втором они выполнились только после выполнения первого???


0. Убрать кластерній индекс по полю c таблицы t
1. Второй запрос добавить в конец первой пачки
2. Обволочь первую пачку в транзакцию
... и т.д. и т.п.
31 авг 11, 10:59    [11204588]     Ответить | Цитировать Сообщить модератору
 Re: старые, добрые блокировки  [new]
iljy
Member

Откуда:
Сообщений: 8711
Запросий,

индекс-то вам чем помешал?
31 авг 11, 11:09    [11204645]     Ответить | Цитировать Сообщить модератору
 Re: старые, добрые блокировки  [new]
virus_system
Member

Откуда: Ульск
Сообщений: 624
Ну я пробывал запросы обвалакивать в транзакцию... но что то все равно у меня второй выполняется вместе с первым, а не после...


делал так...
begin transaction tr1
update t set c = 5 where id = 3
update t set c = 9 where id = 5
update t set c = 8 where id = 5
update t set c = 7 where id = 6
update t set c = 6 where id = 45
commit transaction tr1

begin transaction tr2
update t set c = 9 where id = 6
begin transaction tr2
31 авг 11, 11:13    [11204662]     Ответить | Цитировать Сообщить модератору
 Re: старые, добрые блокировки  [new]
Запросий
Guest
virus_system
Ну я пробывал запросы обвалакивать в транзакцию... но что то все равно у меня второй выполняется вместе с первым, а не после...


делал так...
begin transaction tr1
update t set c = 5 where id = 3
update t set c = 9 where id = 5
update t set c = 8 where id = 5
update t set c = 7 where id = 6
update t set c = 6 where id = 45
commit transaction tr1

begin transaction tr2
update t set c = 9 where id = 6
begin transaction tr2


Индекс кластерный есть? (по полю с)
31 авг 11, 11:15    [11204682]     Ответить | Цитировать Сообщить модератору
 Re: старые, добрые блокировки  [new]
virus_system
Member

Откуда: Ульск
Сообщений: 624
Запросий
virus_system
Ну я пробывал запросы обвалакивать в транзакцию... но что то все равно у меня второй выполняется вместе с первым, а не после...


делал так...
begin transaction tr1
update t set c = 5 where id = 3
update t set c = 9 where id = 5
update t set c = 8 where id = 5
update t set c = 7 where id = 6
update t set c = 6 where id = 45
commit transaction tr1

begin transaction tr2
update t set c = 9 where id = 6
begin transaction tr2


По полю Id есть кластерный индекс, а по полю c - нету

Индекс кластерный есть? (по полю с)
31 авг 11, 11:17    [11204695]     Ответить | Цитировать Сообщить модератору
 Re: старые, добрые блокировки  [new]
virus_system
Member

Откуда: Ульск
Сообщений: 624
По полю Id есть кластерный индекс, а по полю c - нету
31 авг 11, 11:18    [11204706]     Ответить | Цитировать Сообщить модератору
 Re: старые, добрые блокировки  [new]
Запросий
Guest
virus_system
По полю Id есть кластерный индекс, а по полю c - нету


Да, по id конечно же

Убей (или смени на некластерный)
31 авг 11, 11:22    [11204735]     Ответить | Цитировать Сообщить модератору
 Re: старые, добрые блокировки  [new]
локи блоки
Guest
virus_system
Ну я пробывал запросы обвалакивать в транзакцию... но что то все равно у меня второй выполняется вместе с первым, а не после...


делал так...
begin transaction tr1
update t set c = 5 where id = 3
update t set c = 9 where id = 5
update t set c = 8 where id = 5
update t set c = 7 where id = 6
update t set c = 6 where id = 45
commit transaction tr1

begin transaction tr2
update t set c = 9 where id = 6
begin transaction tr2


предположу что сиквел лучшей стратегией блокировки выбирает все-таки rowlock, а не tablock, и пока вы не начали апдейтить id=6 блокировку он на него не поставит.
31 авг 11, 11:23    [11204741]     Ответить | Цитировать Сообщить модератору
 Re: старые, добрые блокировки  [new]
virus_system
Member

Откуда: Ульск
Сообщений: 624
локи блоки
предположу что сиквел лучшей стратегией блокировки выбирает все-таки rowlock, а не tablock, и пока вы не начали апдейтить id=6 блокировку он на него не поставит.


Что то я не много не понял...
31 авг 11, 11:25    [11204755]     Ответить | Цитировать Сообщить модератору
 Re: старые, добрые блокировки  [new]
Запросий
Guest
Запросий
virus_system
По полю Id есть кластерный индекс, а по полю c - нету


Да, по id конечно же

Убей (или смени на некластерный)


PS
Насчет "смени на некластерный" я не особо уверен, это проверь сам.
31 авг 11, 11:26    [11204770]     Ответить | Цитировать Сообщить модератору
 Re: старые, добрые блокировки  [new]
virus_system
Member

Откуда: Ульск
Сообщений: 624
Запросий
Да, по id конечно же

Убей (или смени на некластерный)


Id у меня PrimaryKey - ничего с ним не могу поделать... А что заве есть ограничения на кластерный не кластерный индекс?
И если есть ограничения, то как с примари кей боротся?
31 авг 11, 11:28    [11204781]     Ответить | Цитировать Сообщить модератору
 Re: старые, добрые блокировки  [new]
локи блоки
Guest
virus_system
локи блоки
предположу что сиквел лучшей стратегией блокировки выбирает все-таки rowlock, а не tablock, и пока вы не начали апдейтить id=6 блокировку он на него не поставит.


Что то я не много не понял...


как вы проверяете что "второй запрос выполняется вместе с первым"?

пошагово выполняете первый, потом запускаете второй? выполнив какую строчку первого запроса запускаете второй?
31 авг 11, 11:33    [11204814]     Ответить | Цитировать Сообщить модератору
 Re: старые, добрые блокировки  [new]
Запросий
Guest
virus_system
Id у меня PrimaryKey - ничего с ним не могу поделать...

Нельзя ли создать примари кей, например, некластерным и как (id, c) - ? (это бы решило)

virus_system
А что заве есть ограничения на кластерный не кластерный индекс?

Читать основы mssql

virus_system
И если есть ограничения, то как с примари кей боротся?

Создавать с учетом архитектуры системы
31 авг 11, 11:33    [11204817]     Ответить | Цитировать Сообщить модератору
 Re: старые, добрые блокировки  [new]
iljy
Member

Откуда:
Сообщений: 8711
virus_system
Ну я пробывал запросы обвалакивать в транзакцию... но что то все равно у меня второй выполняется вместе с первым, а не после...


делал так...

Делайте так
begin transaction
update t set c = 5 from t with(tablockx) where id = 3
update t set c = 9 where id = 5
update t set c = 8 where id = 5
update t set c = 7 where id = 6
update t set c = 6 where id = 45
commit transaction
Но повторяю вопрос- на хрена это все нужно? Где гарантия, что вторая сессия не стартует раньше всей т
31 авг 11, 11:36    [11204838]     Ответить | Цитировать Сообщить модератору
 Re: старые, добрые блокировки  [new]
iljy
Member

Откуда:
Сообщений: 8711
virus_system,

Но повторяю вопрос- на хрена это все нужно? Где гарантия, что вторая сессия не стартует раньше всей первой?
31 авг 11, 11:38    [11204849]     Ответить | Цитировать Сообщить модератору
 Re: старые, добрые блокировки  [new]
локи блоки
Guest
iljy
virus_system
Ну я пробывал запросы обвалакивать в транзакцию... но что то все равно у меня второй выполняется вместе с первым, а не после...


делал так...

Делайте так
begin transaction
update t set c = 5 from t with(tablockx) where id = 3
update t set c = 9 where id = 5
update t set c = 8 where id = 5
update t set c = 7 where id = 6
update t set c = 6 where id = 45
commit transaction
Но повторяю вопрос- на хрена это все нужно? Где гарантия, что вторая сессия не стартует раньше всей т


чувак походу нажимает begin tran и ждет что сервер догадается заблокировать правильные записи в правильной таблице.
я про то что апдейт id=6 для его теста достаточно вперед подвинуть.
31 авг 11, 11:39    [11204857]     Ответить | Цитировать Сообщить модератору
 Re: старые, добрые блокировки  [new]
локи блоки
Guest
Запросий
Насчет "смени на некластерный" я не особо уверен, это проверь сам.

поясните откуда вобще рассуждения про кластерный/некластерный?
31 авг 11, 11:41    [11204876]     Ответить | Цитировать Сообщить модератору
 Re: старые, добрые блокировки  [new]
virus_system
Member

Откуда: Ульск
Сообщений: 624
iljy
virus_system,

Но повторяю вопрос- на хрена это все нужно? Где гарантия, что вторая сессия не стартует раньше всей первой?


у меня может вторая раньше стартануть...

Я просто на каждой сессии хочу поставить блокировку, что бы каждая последующая ждала предудущую...
31 авг 11, 11:42    [11204878]     Ответить | Цитировать Сообщить модератору
 Re: старые, добрые блокировки  [new]
virus_system
Member

Откуда: Ульск
Сообщений: 624
локи блоки
чувак походу нажимает begin tran и ждет что сервер догадается заблокировать правильные записи в правильной таблице.
я про то что апдейт id=6 для его теста достаточно вперед подвинуть.



Я просто эти запросы запускаю в своем клиенте... сначала один, а посто другой (пока выполняется первый). Так у меня клиент сначала говорит, что у меня отработал второй запрос,а потом говорит - что первый отработал...
31 авг 11, 11:44    [11204896]     Ответить | Цитировать Сообщить модератору
 Re: старые, добрые блокировки  [new]
iljy
Member

Откуда:
Сообщений: 8711
virus_system
локи блоки
чувак походу нажимает begin tran и ждет что сервер догадается заблокировать правильные записи в правильной таблице.
я про то что апдейт id=6 для его теста достаточно вперед подвинуть.



Я просто эти запросы запускаю в своем клиенте... сначала один, а посто другой (пока выполняется первый). Так у меня клиент сначала говорит, что у меня отработал второй запрос,а потом говорит - что первый отработал...

И? Какая разница-то? Если запросы зависимые - выполняйте их в одной сессии, если нет - какая вам разница, в каком порядке они сработают?
31 авг 11, 11:46    [11204915]     Ответить | Цитировать Сообщить модератору
 Re: старые, добрые блокировки  [new]
локи блоки
Guest
virus_system,

так я вас еще раз спрашиваю, вы ждете что после выполнения begni tran вся база данных от второго заблокируется что ли?
31 авг 11, 11:48    [11204933]     Ответить | Цитировать Сообщить модератору
 Re: старые, добрые блокировки  [new]
virus_system
Member

Откуда: Ульск
Сообщений: 624
iljy
И? Какая разница-то? Если запросы зависимые - выполняйте их в одной сессии, если нет - какая вам разница, в каком порядке они сработают?


запросы независимые...
Просто поьзователь делает какю то операцию, после нее идет сохранение.
Тут получается пользователь делает две операции.
Но сохраняться надо после каждой операции пользователся. вот
31 авг 11, 11:53    [11204983]     Ответить | Цитировать Сообщить модератору
 Re: старые, добрые блокировки  [new]
локи блоки
Guest
virus_system,

чтобы тестировать как устанавливаются и разруливаются блокировки нужно не монетки подбрасывать а пошагово выполнять.
делайте в ssms. выполняйте построчно.
31 авг 11, 11:55    [11204991]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить