powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / вставка уникального значения.
23 сообщений из 48, страница 2 из 2
вставка уникального значения.
    #39913029
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

Я там пытаюсь ваш код обсуждаю который вы прокоментировали 2 раза и как мне показалось эти разы протворечивы.

Если делать как было паказано в 22056821 - в очередь встанут только добавлятели, ну и некоторые писатели, если будут модифицировать/удалять строку с максимальным NUM

А в том посте 220...
Код был такой
Код: sql
1.
select top (1) @NUM = NUM from SPK_TEST13 with (updlock, serializable) 



Из этого я понял, что читателям дана полная свобода. А это плохо.


Но за тем вы пишите, что ваша строчка все же работает иначе:

После выполнения этого запроса и до завершения транзакции, в других транзакциях невозможно будет прочитать, изменить, добавить или удалить
...
Рейтинг: 0 / 0
вставка уникального значения.
    #39913031
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник


Сиквансы и идентити я выше говорил, что это не подходит. Я велосипед нагородил чтобы понять как работают транзакции
...
Рейтинг: 0 / 0
вставка уникального значения.
    #39913033
Gerros
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хм...
...
Рейтинг: 0 / 0
вставка уникального значения.
    #39913044
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
Из этого я понял, что читателям дана полная свобода. А это плохо.
Ничего вы не поняли.
В 22057563 написано максимально подробно каким именно читателям полная свобода, а каким нет.
...
Рейтинг: 0 / 0
вставка уникального значения.
    #39913049
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
andron81,

хотя вот оно определение монопольной блокировки:

монопольная (exclusive) - означает, что только одна сессия может установить эту блокировку в один момент времени.
ни о каких пользователях речи нет.
Конечно, о пользователях речи вообще не идёт, пользователи - юридическое понятие, используемое для определения платежей, и техническое, для разграничения прав.

А тут мы говорим о сессиях.
andron81
invm, неа. мне показалось, что выше Вы писали иначе о том что будет происходить, если так расставить изоляцию
Нет, тут путаница из за разных вариантов изоляции, разных хинтов.

Если указать tablockx, то будет заблокирована вся таблица дшля всех действий, кроме действий блокирующей сесии
А если, как написал invm, указать (updlock, serializable), то будет заблокировано только получение нового ID, а вот чтение, изменение, и даже добавление предыдущих записей будет разрешено.
...
Рейтинг: 0 / 0
вставка уникального значения.
    #39913050
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg



А если, как написал invm, указать (updlock, serializable), то будет заблокировано только получение нового ID, а вот чтение, изменение, и даже добавление предыдущих записей будет разрешено.


Да, вот это NUM >= @NUM, я профанарил.
...
Рейтинг: 0 / 0
вставка уникального значения.
    #39913091
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
andron81,

Не вижу разницы. "Добавлятель" - это ваш код и стартового поста.


спасибо . в теории всё вроде бы понял. но стал экспериментировать и наткнулся на непонимание , что происходит.
запустил 2 скрипта последовательно - скрипт1 и скрипт2. Скрипт1 с задержкой, Скрипт2 без. Оба пока без инсертов , первый как полагается отработал через 30 секунд. а второй крутится и крутится и крутится. скрипты прилагаю.

Скрипт1
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
BEGIN TRAN;
DECLARE @NEW_NUM INT;
select top (1) @NEW_NUM = NUM from SPK_TEST13 with (updlock, serializable) order by NUM desc;
select @NEW_NUM
--INSERT INTO SPK_TEST13(NUM) VALUES (@NEW_NUM)

WAITFOR DELAY '00:00:30';

COMMIT TRAN;
go
SELECT * FROM SPK_TEST13 




Скрипт2
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
BEGIN TRAN;
DECLARE @NEW_NUM INT;
select top (1) @NEW_NUM = NUM from SPK_TEST13 with (updlock, serializable) order by NUM desc;
select @NEW_NUM
--INSERT INTO SPK_TEST13(NUM) VALUES (@NEW_NUM)
--WAITFOR DELAY '00:00:30';

COMMIT TRAN;
go
SELECT * FROM SPK_TEST13 
...
Рейтинг: 0 / 0
вставка уникального значения.
    #39913093
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
запустил 2 скрипта последовательно - скрипт1 и скрипт2. Скрипт1 с задержкой, Скрипт2 без. Оба пока без инсертов , первый как полагается отработал через 30 секунд. а второй крутится и крутится и крутится. скрипты прилагаю.
А у меня второй ждал, пока первый отработает, а потом сразу завершился. Как и должно быть.

Лучше и скрипт создания таблицы тоже приложите, включая все её объекты (индексы, констрейны и т.д.)
...
Рейтинг: 0 / 0
вставка уникального значения.
    #39913095
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
andron81
запустил 2 скрипта последовательно - скрипт1 и скрипт2. Скрипт1 с задержкой, Скрипт2 без. Оба пока без инсертов , первый как полагается отработал через 30 секунд. а второй крутится и крутится и крутится. скрипты прилагаю.
А у меня второй ждал, пока первый отработает, а потом сразу завершился. Как и должно быть.

Лучше и скрипт создания таблицы тоже приложите, включая все её объекты (индексы, констрейны и т.д.)


спасибо за участие.
ну там таблица которую создал без всяких отсебяшных индексов. с одним только полем NUM которое я сделал первичным ключом.

вот ещё могу что показать:
картинка
...
Рейтинг: 0 / 0
вставка уникального значения.
    #39913100
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да . сейчас попробовал на другой базе. всё работает - странно , а что это было ?
а можно что-нибудь сказать по той картинке где результат выполнения sp_who2, sp_lock на тот висящий момент ?


alexeyvg


Лучше и скрипт создания таблицы тоже приложите, включая все её объекты (индексы, констрейны и т.д.)



вот такой скрипт
Код: sql
1.
create table SPK_TEST13 (NUM numeric(10) PRIMARY KEY )
...
Рейтинг: 0 / 0
вставка уникального значения.
    #39913104
entrypoint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
andron81,

Так не будет работать, не увеличиваете NUM, одно и то же вставляете, при добавлении в таблицу свалится на PRIMARY KEY

Код: sql
1.
select top (1) @NUM = NUM from SPK_TEST13 with (updlock, serializable) 


нужно

Код: sql
1.
select top (1) @NUM = NUM + 1 from SPK_TEST13 with (updlock, serializable) 



select top (1) @NEW_NUM = NUM from SPK_TEST13 with (updlock, serializable) order by NUM desc;
...
Рейтинг: 0 / 0
вставка уникального значения.
    #39913106
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
да . сейчас попробовал на другой базе. всё работает - странно , а что это было ?
Мало ли, экспериментировали, забыли какое то окно с транзакцией.

andron81
а можно что-нибудь сказать по той картинке где результат выполнения sp_who2, sp_lock на тот висящий момент ?
Конечно. Там будет видно, кто кого блокировал. Дальше нужно найти окна с соотв. SPID, и всё будет понятно.
В данном случае блокирующий SPID = 57, ищите это окошко. Можете в нём выполнить select @@trancount, он будет больше 0.
...
Рейтинг: 0 / 0
вставка уникального значения.
    #39913108
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
entrypoint
Так не будет работать, не увеличиваете NUM, одно и то же вставляете, при добавлении в таблицу свалится на PRIMARY KEY
Это само собой, но в принципе у ТС задача разобраться с транзакциями, так что неважно.
...
Рейтинг: 0 / 0
вставка уникального значения.
    #39913153
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg

andron81


а можно что-нибудь сказать по той картинке где результат выполнения sp_who2, sp_lock на тот висящий момент ?
Конечно. Там будет видно, кто кого блокировал. Дальше нужно найти окна с соотв. SPID, и всё будет понятно.
В данном случае блокирующий SPID = 57, ищите это окошко. Можете в нём выполнить select @@trancount, он будет больше 0.



[/quot]

справоцировать по новой это не удалось.

странно всё это . вы пишите , что что-то блокирующее в сеансе с номером 57. Но из картинки видно, что сеанс всё закончил и простаивает ("Awaiting command").
Вы хотите сказать , что транзакция до сих пор активна в этом сеансе ? а почему ? там ведь кроме моих сеансов и сеансов BuhServer/Администратор (причем не думаю , что ковыряния в базе msdb затрагивает нашу транзакцию из 57) ничего ведь нет .
...
Рейтинг: 0 / 0
вставка уникального значения.
    #39913154
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
Но из картинки видно, что сеанс всё закончил и простаивает ("Awaiting command").



1. Открываем новое окошко SSMS
2. Выполняем команду begin tran
3. Смотрим состояние сессии
...
Рейтинг: 0 / 0
вставка уникального значения.
    #39913180
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
andron81
Но из картинки видно, что сеанс всё закончил и простаивает ("Awaiting command").



1. Открываем новое окошко SSMS
2. Выполняем команду begin tran
3. Смотрим состояние сессии


это ведь и было сделано и снимок sp_who2 есть.
вот тут об этом я писал.
22057670

там и картинка с sp_who2 .
вот и загадка в картинке : процесс 62 подвис из-за процесса 57. а 57 все как бы закончил (sleeping, Awaiting command).
...
Рейтинг: 0 / 0
вставка уникального значения.
    #39913182
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
а 57 все как бы закончил (Awaiting command).
Это не значит, что завершились открытые транзакции.
В вашем 57, на начало выполнения скрипта, уже была открытая транзакция.
...
Рейтинг: 0 / 0
вставка уникального значения.
    #39913191
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm

В вашем 57, на начало выполнения скрипта, уже была открытая транзакция.


вы хотите сказать ,что хоть я и запускал процесс 57 раньше 62, но в скрипте 62-го транзакция сработала раньше 57-го ?
...
Рейтинг: 0 / 0
вставка уникального значения.
    #39913196
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
вы хотите сказать ,что хоть я и запускал процесс 57 раньше 62, но в скрипте 62-го транзакция сработала раньше 57-го ?
Нет. Я говорю, что в 57, на момент запуска скрипта, уже была незавершенная транзакция
...
Рейтинг: 0 / 0
вставка уникального значения.
    #39913201
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
andron81
вы хотите сказать ,что хоть я и запускал процесс 57 раньше 62, но в скрипте 62-го транзакция сработала раньше 57-го ?
Нет. Я говорю, что в 57, на момент запуска скрипта, уже была незавершенная транзакция


не понял. Получается в 57 транзакция не отработала ? Во всяком случае я в 57 в окно заходил скрипт отработал и выдал. можно предположить какая это транзакция (моя или чья-то ещё)?
...
Рейтинг: 0 / 0
вставка уникального значения.
    #39913207
andron81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81,
единственное что я делал до этого это создавал таблицу SPK_TEST13 с одним полем(первичный ключ) по средствам менеджмент студио
...
Рейтинг: 0 / 0
вставка уникального значения.
    #39913209
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
Получается в 57 транзакция не отработала ?
Нет.
Получается, что в 57 просто есть незавершенная транзакция. Причин из-за чего может быть несколько.
Например, прервали выполнение. Или выполнили только часть скрипта, без коммита. Или выполнение было прервано по ошибке. И т.п.
Что бы снизить вероятность этого, рекомендуется включать опцию xact_abort.
...
Рейтинг: 0 / 0
вставка уникального значения.
    #39913228
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
andron81
странно всё это . вы пишите , что что-то блокирующее в сеансе с номером 57. Но из картинки видно, что сеанс всё закончил и простаивает ("Awaiting command").
Вы хотите сказать , что транзакция до сих пор активна в этом сеансе ? а почему ?
Ну как, вы запустили команду BEGIN TRAN.
Она выполнилась, и всё, сервер ждёт от вас следующих команд в этой сессии.
А вы ушли обедать, ничего не делаете, окно не закрыли.
Вот и будет открытая транзакция, заблокированные ресурсы, и статус Awaiting command. Пока вы не закроете коннект (окно в SSMS), либо не выполните COMMIT TRAN, либо пока кто то не кильнёт вашу сессию.
...
Рейтинг: 0 / 0
23 сообщений из 48, страница 2 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / вставка уникального значения.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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