powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как узнать, что запись, которую собираешься редактировать, заблокирована
13 сообщений из 13, страница 1 из 1
Как узнать, что запись, которую собираешься редактировать, заблокирована
    #32047382
Серг70
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сразу оговорюсь, специальную таблицу содержащую информацию о блокированных записях держать не хочется
...
Рейтинг: 0 / 0
Как узнать, что запись, которую собираешься редактировать, заблокирована
    #32047383
Фотография Jimmy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здесь посмотри\r
\r
ЗЫ Этот топик находится на 18-20 строк ниже твоего. Может, ПОИСК бы тебе помог?
...
Рейтинг: 0 / 0
Как узнать, что запись, которую собираешься редактировать, заблокирована
    #32047389
Фотография snake
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мы используем пару процедур:
sp_getapplock
sp_releaseapplock
Смысл сейчас не вспомню...
по моему устанавливается поименованная блокировка при редактировании, соответственно если редактирование не завершено, установка новой поименованной блокировки не возможна...
...
Рейтинг: 0 / 0
Как узнать, что запись, которую собираешься редактировать, заблокирована
    #32047398
Серг70
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я блокирую записи для совместого использования, чтобы другие пользователи могли читать, но не редактировать
Код: plaintext
1.
Begin Transaction
Select * From SP6 With (HoldLock) Where Id= 1 

Другой пользователь должен получить сообщение, что запись заблокирована
Метод, предложенный Dankov
************
В принципе можно получить набор данных, содержажий первичные ключи (или записи целиком), залоченных записей в таблице:
1) отбираем все записи с хинтом NOLOCK
2) отбираем незалоченные записи хинтом READPAST
3) разница между ними и есть залоченные записи.

Есно, это все пишется в один запрос.
************
в моем случае не работает - оба запроса дают один и тот же результат

А прежде чем задать вопрос, конечно же посмотрел все близкие темы ...
...
Рейтинг: 0 / 0
Как узнать, что запись, которую собираешься редактировать, заблокирована
    #32047560
Серг70
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почесавшись, родил ХП, определяющую, заблокирована ли запись (@RowId) в таблице (@TableName) для совместного использования процессом, отличным от заданного (@SPId) .
Предполагается, что таблицы имеют поле Id с кластерным индексом
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
CREATE PROCEDURE Blk_RowTable
	@SPId Int,@TableName VarChar( 20 ),@RowId Numeric( 12 ),@Cnt_blocked Int Out
AS
Begin

Declare @SrtExec VarChar( 200 ),@ObjId Numeric( 12 ),@IndId Numeric( 12 ),@Resource Char( 16 )

Begin Transaction
Select @SrtExec='Declare @id Numeric(12) Select @id=id From '+@TableName+' With (HoldLock)'+' Where Id='+Str(@RowId)
exec (@SrtExec)
select 	
	@ObjId=rsc_objid,
	@IndId=rsc_indid,
	@Resource=substring (rsc_text,  1 ,  16 )
from 	master.dbo.syslockinfo,
	master.dbo.spt_values v
where   master.dbo.syslockinfo.rsc_type = v.number
	and v.type = 'LR'
	and substring (v.name,  1 ,  4 )='KEY '
	and convert (smallint, req_spid)=@SPId

 --Select 	@ObjId objid,
 
 --	@IndId indid,
 
 --	@Resource Resource,
 
 --	@SPId SPId
 

select @cnt_blocked=count(req_spid) 
from 	master.dbo.syslockinfo,
	master.dbo.spt_values v
where   master.dbo.syslockinfo.rsc_type = v.number
	and v.type = 'LR'
	and @ObjId=rsc_objid
	and @IndId=rsc_indid
	and 'KEY '=substring (v.name,  1 ,  4 )
	and @Resource=substring (rsc_text,  1 ,  16 )
	and convert (smallint, req_spid)<>@SPId
RollBack Transaction
End
GO

Процедура создана на основе sp_lock
Блокировка записей для совместного использования осуществляется командами типа
Код: plaintext
1.
2.
Begin Transaction
Select * From SP6 With (HoldLock) Where Id= 1 

И стало мне счастье
...
Рейтинг: 0 / 0
Как узнать, что запись, которую собираешься редактировать, заблокирована
    #32047572
Фотография YellowMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А можно глупый вопрос ?
А что такое "запись заблокирована " ? Что это для Вас значит ?
...
Рейтинг: 0 / 0
Как узнать, что запись, которую собираешься редактировать, заблокирована
    #32047631
Фотография SergSuper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Серг70
А Вы то сами такое использовали?
Круто конечно, но... Человек идёт по тупиковому пути, а Вы ему помогаете идти еще дальше
...
Рейтинг: 0 / 0
Как узнать, что запись, которую собираешься редактировать, заблокирована
    #32047638
Фотография MiCe
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
блин.... как... как...
наткунтся на ошибку....
и обработать ее...
вопрос за последнию неделю обсуждается каждый день....
ну объясните мне ,- ЗАЧЕМ Вам это нужно?
...
Рейтинг: 0 / 0
Как узнать, что запись, которую собираешься редактировать, заблокирована
    #32047694
Серг70
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Постараюсь ответить всем
Исходная задача :
Пользователь решил модифицировать ряд данных, связанных (может через несколько таблиц) с конкретной записью заданной таблицы. Информация о допустимости модификации считывается из БД (из заданной таблицы) многими пользователями, как правило с утра. У всех данные одни и те же. Процесс модификации может длится от нескольких минут до часов. При этом последовательно пересчитанные данные из одних таблиц добавляются в другие. В этом случае пользователь, начавший процесс, должен заблокировать возможность запустить тот же процес модификации для других ползователей, при этом давая работать с данными в режиме чтения, включая и исходную таблицу.
Конечно, можно создать справочную таблицу и туда при начале процесса выкладывать а по окончании удалять имя таблицы и номер заблокированной записи. Но рухнувшие до окончания процесса соединения оставят заблокированными записи. Но и здесь можно победить, вставляя запись в справочную таблицу под транзакцией, а всем давая читать эту таблицу при незавершенной транзакции. Но в результате имеем лишнюю активно ипользуемую (и увеличивающую лог) таблицу.
Вот для чего я и затеял всю эту байду.
...
Рейтинг: 0 / 0
Как узнать, что запись, которую собираешься редактировать, заблокирована
    #32047699
Фотография snake
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про sp_getapplock, sp_releaseapplock читали?
...
Рейтинг: 0 / 0
Как узнать, что запись, которую собираешься редактировать, заблокирована
    #32047770
Серг70
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 snake
Предлагаемые Вами процедуры для блокирования ресурса могут обрабатываться только из приложений, так как фактически запрашиваемый ресурс не блокируется, а информация о нем заносится в системную таблицу master.dbo.syslockinfo . Да, в приложении можно соответствующим образом псевдоблокировку этого ресурса обработать. Но в случае использования ресурсов напрямую (вне приложения) нужно проверить визуально информацию о заблокированном ресурсе процедурой sp_lock , и если ресурс помечен как заблокированный, то с ним ничего не делать. Мой же метод физически блокирует ресурс и даже напрямую с ним ничего не сделаешь.
...
Рейтинг: 0 / 0
Как узнать, что запись, которую собираешься редактировать, заблокирована
    #32047775
Фотография snake
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
даже напрямую с ним ничего не сделаешь
Боюсь даже предположить, что у меня такое возможно... Напрямую с таблицами не работает никто.
...
Рейтинг: 0 / 0
Как узнать, что запись, которую собираешься редактировать, заблокирована
    #32047791
Серг70
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как же поддерка БД? Неужели ваши пользователи не совершают необратимых ошибок. Наши - только дай. Держим специальных программеров, вычищающих за ними плюхи. Есно, работают они с таблицами напрямую (ну быть может с применением каких-либо скриптов)
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как узнать, что запись, которую собираешься редактировать, заблокирована
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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