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

Суть проблемы:

Используется Provider=MSDataShape, и как я понимаю он
может использовать только adLockBatchOptimistic.


Две клиентских программы одновременно изменяют
одни и те же записи (строчки накладной).
Если в первой программе удалили строчку (равно как и изменили),
и во второй вызвать UpdateBatch - возникает ошибка.

т.е:
возникает ситуация: когда 1-й и 2-й пользователь одновременно редактируют
одну и ту же длинную- предлинную накладную неуспевший подтвердить
изменения получает фигу .
6 фев 03, 14:36    [123393]     Ответить | Цитировать Сообщить модератору
 Re: ADO & SQL Server , блокировка записей  [new]
Pavel
Member

Откуда: Кемерово
Сообщений: 2435
Клиентским курсором эта ситуация нерешаема. Возможно имеет смысл реализовать собственную систему блокировки.
6 фев 03, 14:40    [123403]     Ответить | Цитировать Сообщить модератору
 Re: ADO & SQL Server , блокировка записей  [new]
Артем1
Member

Откуда: www.desnogorsk.{ru||net} -> Москва
Сообщений: 2036
Может, попробовать забирать строчки на изменение select-ом без блокировки, а изменения отсылать отдельной коммандой для каждой строки накладной? У меня была похожая проблема. Этот способ помог.
6 фев 03, 14:44    [123412]     Ответить | Цитировать Сообщить модератору
 Re: ADO & SQL Server , блокировка записей  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Уж сколько раз твердили миру: Блокировками в архитектуре клиент/сервер пусть занимается сервер.

Ну реализуйте вы бизнес-логике своей системы функциональность, при которой любой пользователь, который открывает документ, уже открытй другим пользователем, получал документ "только для чтения" с и информацией о том, что документ открыт тогда-то, пользователем таким-то, с рабочей станцией такой-то.

У меня вся система докуменооборота на этом построена!
6 фев 03, 14:49    [123421]     Ответить | Цитировать Сообщить модератору
 Re: ADO & SQL Server , блокировка записей  [new]
Zeppelin
Guest
А чё сказать тогда второму юзеру?
6 фев 03, 17:55    [123708]     Ответить | Цитировать Сообщить модератору
 Re: ADO & SQL Server , блокировка записей  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Тоже самое. Лучше, чем механизм блокировок SQL Server вряд ли он придумает.
6 фев 03, 18:01    [123718]     Ответить | Цитировать Сообщить модератору
 Re: ADO & SQL Server , блокировка записей  [new]
Crip
Member

Откуда:
Сообщений: 2490
Интересно знать каким образом это все реализовано? Хотя бы в общих чертах? Просто я плохо представляю нормальную блокировку документа без использования 3-х звенки. Что допустим, происходит, если клиент работующий с документом по каким -то причинам "отваливается"?
6 фев 03, 18:13    [123730]     Ответить | Цитировать Сообщить модератору
 Re: ADO & SQL Server , блокировка записей  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Все реализовано на двухзвенке. Долго рожал такой механизм. Поэтому деталями делиться не буду.
6 фев 03, 18:23    [123743]     Ответить | Цитировать Сообщить модератору
 Re: ADO & SQL Server , блокировка записей  [new]
Pavel
Member

Откуда: Кемерово
Сообщений: 2435
Все реализовано на двухзвенке. Долго рожал такой механизм. Поэтому деталями делиться не буду.
Лучше бы ты промолчал, замученный родами. Мне, лично, сильно пофигу что ты там у себя наваял, но гордись этим молча. Не знаю как насчет других участникоф форума, а от меня теперь уж точно помощи не жди.
6 фев 03, 20:18    [123837]     Ответить | Цитировать Сообщить модератору
 Re: ADO & SQL Server , блокировка записей  [new]
Белов Владимир
Member

Откуда: Москва
Сообщений: 1716
А клиент на чем написан ?
6 фев 03, 20:47    [123856]     Ответить | Цитировать Сообщить модератору
 Re: ADO & SQL Server , блокировка записей  [new]
Белов Владимир
Member

Откуда: Москва
Сообщений: 1716
>pkarklin
ИМХО, Вы не правы.
6 фев 03, 20:47    [123857]     Ответить | Цитировать Сообщить модератору
 Re: ADO & SQL Server , блокировка записей  [new]
Mike Evteev
Member

Откуда:
Сообщений: 573
Как насчет начинать транзакцию с update?
Тогда все остальные пользователи будуть получать отлуп.
Не так уж и сложно, а?
6 фев 03, 23:49    [123898]     Ответить | Цитировать Сообщить модератору
 Re: ADO & SQL Server , блокировка записей  [new]
ADO
Guest
>>А чё сказать тогда второму юзеру?

Сказать, что запись изменяет ему с другим юзером.
7 фев 03, 00:31    [123910]     Ответить | Цитировать Сообщить модератору
 Re: ADO & SQL Server , блокировка записей  [new]
Дамир
Guest
Я вот не просекаю....
Начал транзакцию с update, ну или select from T(updatelock) - заблокировал запись, хорошо.
Теперь второй юзер пытается тот же документ поредактировать - выдает update, и чё будет? А будет энтот юзер ожидать сонца транзакции 1-го юзера.
И никак ты ему ничё не выдашь на экран, разве что вылетит прога по таймауту...
7 фев 03, 07:55    [123957]     Ответить | Цитировать Сообщить модератору
 Re: ADO & SQL Server , блокировка записей  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
To Pavel
Вот тока грубить не надо.
Если тебя задел мой отказ делиться решением, то ето твои личные проблемы. Я посмотрю, как ты будешь мучаться в родах, рожая свою систему блокировок.

То Zeppelin
вот что я использую:

1. Создаем таблицу следующей структуры:
CREATE TABLE [dbo].[tblOpenDocs] (

[docid] [int] NOT NULL ,
[spid] [smallint] NOT NULL ,
[hostname] [nchar] (128) NOT NULL ,
[hostprocess] [nchar] (8) NOT NULL ,
[nt_username] [nchar] (128) NOT NULL ,
[login_time] [datetime] NOT NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[tblOpenDocs] WITH NOCHECK ADD
CONSTRAINT [PK_tblOpenDocs] PRIMARY KEY NONCLUSTERED
(
[docid]
) WITH FILLFACTOR = 90 ON [PRIMARY]
GO


Создаем хп:
CREATE PROCEDURE usp_UpdateDocEditingStatus @docid int,

@action tinyint,
@hostname varchar(128) out,
@nt_username varchar(128) out,
@user_description varchar(128) out
--Процедура отслеживания документов, открытых в режиме редактирования

--Входные параметры:

-- @docid - идентификатор документа

-- @action - 1-документ открывается; 2- документ закрывается, 3 - документ удаляется

--Выходные параметры:

-- @hostname - рабочая станция

-- @nt_username - имя пользователя

-- @user_description - описание пользователя: Фамилия И.О. (цех)

--Результат выполнения

-- 0 - документ свободен

-- -1 - документ уже используется


AS
SET NOCOUNT ON
IF @action = 1 BEGIN
IF EXISTS(SELECT tblOpenDocs.*
FROM tblOpenDocs
INNER JOIN master..sysprocesses sysproc ON
tblOpenDocs.spid = sysproc.spid AND
tblOpenDocs.hostname = sysproc.hostname AND
tblOpenDocs.hostprocess = sysproc.hostprocess AND
tblOpenDocs.nt_username = sysproc.nt_username AND
tblOpenDocs.login_time = sysproc.login_time
WHERE tblOpenDocs.docid = @docid) BEGIN
SELECT @hostname = tblOpenDocs.hostname,
@nt_username = tblOpenDocs.nt_username,
@user_description = (tblPersonalCards.colFamilyName + ' ' +
UPPER(LEFT(tblPersonalCards.colName, 1)) + '.' +
UPPER(LEFT(tblPersonalCards.colPatronymic, 1)) + '.')
FROM tblOpenDocs
LEFT OUTER JOIN tblUsers ON
UPPER(tblOpenDocs.nt_username) = UPPER(tblUsers.colUserName)
LEFT OUTER JOIN tblPersonalCards ON
tblUsers.colPersonalID = tblPersonalCards.colPersonalID
WHERE docid = @docid
RETURN(-1)
END
ELSE BEGIN
DELETE tblOpenDocs
WHERE docid = @docid
INSERT INTO tblOpenDocs(docid, spid, hostname, hostprocess, nt_username, login_time)
SELECT @docid,
sysproc.spid,
sysproc.hostname,
sysproc.hostprocess,
sysproc.nt_username,
sysproc.login_time
FROM master..sysprocesses sysproc
WHERE sysproc.spid = @@spid
RETURN(0)
END
END

IF @action = 2 BEGIN
DELETE tblOpenDocs
WHERE docid = @docid AND
spid = @@spid

RETURN(0)
END

IF @action = 3 BEGIN
IF EXISTS(SELECT tblOpenDocs.*
FROM tblOpenDocs
INNER JOIN master..sysprocesses sysproc ON
tblOpenDocs.spid = sysproc.spid AND
tblOpenDocs.hostname = sysproc.hostname AND
tblOpenDocs.hostprocess = sysproc.hostprocess AND
tblOpenDocs.nt_username = sysproc.nt_username AND
tblOpenDocs.login_time = sysproc.login_time
WHERE tblOpenDocs.docid = @docid) BEGIN
SELECT @hostname = tblOpenDocs.hostname,
@nt_username = tblOpenDocs.nt_username,
@user_description = (tblPersonalCards.colFamilyName + ' ' +
UPPER(LEFT(tblPersonalCards.colName, 1)) + '.' +
UPPER(LEFT(tblPersonalCards.colPatronymic, 1)) + '.')
FROM tblOpenDocs
LEFT OUTER JOIN tblUsers ON
UPPER(tblOpenDocs.nt_username) = UPPER(tblUsers.colUserName)
LEFT OUTER JOIN tblPersonalCards ON
tblUsers.colPersonalID = tblPersonalCards.colPersonalID
WHERE docid = @docid
RETURN(-1)
END
ELSE BEGIN
DELETE tblOpenDocs
WHERE docid = @docid
RETURN(0)
END
END

SET NOCOUNT OFF
RETURN(0)

GO

Права на выполнение даем public. Это все на серверной части.

Осталось только в нужные места клиентских приложений включить соответствующие вызовы. При отваливании клиента (что проверялось разными способами, например, грубое вырубание машин) максимальное время подвисания процесса 5 секунд.
7 фев 03, 08:21    [123964]     Ответить | Цитировать Сообщить модератору
 Re: ADO & SQL Server , блокировка записей  [new]
Crip
Member

Откуда:
Сообщений: 2490
Вообщем понятно... Все основано на sp_who... Это недостаточно надежно...
7 фев 03, 09:39    [124001]     Ответить | Цитировать Сообщить модератору
 Re: ADO & SQL Server , блокировка записей  [new]
Crip
Member

Откуда:
Сообщений: 2490
Хотя я немного погорячился... Нормальное решение, просто оно совсем не ново, зато какие пафосные замечания...
7 фев 03, 09:41    [124003]     Ответить | Цитировать Сообщить модератору
 Re: ADO & SQL Server , блокировка записей  [new]
Zeppelin
Guest
to pkarklin
Спасибо , попробую твой вариант. О результатах обязательно сообщу.
7 фев 03, 10:18    [124054]     Ответить | Цитировать Сообщить модератору
 Re: ADO & SQL Server , блокировка записей  [new]
Pavel
Member

Откуда: Кемерово
Сообщений: 2435
2 Zeppelin
Вот тока грубить не надо.
Теперь не буду.
Если тебя задел мой отказ делиться решением, то ето твои личные проблемы.
Ну так поделился же.
Я посмотрю, как ты будешь мучаться в родах, рожая свою систему блокировок.
А предложеннвй тобой способ не является реализацией системы блокировок на уровне документа, Т.е. собственной системой блокировок?
7 фев 03, 10:35    [124079]     Ответить | Цитировать Сообщить модератору
 Re: ADO & SQL Server , блокировка записей  [new]
Axl Dead
Guest
Может и глупый вопрос, но всё же...
При реализации запросов любого вида (SELECT, INSERT, UPDATE, DELETE) через браузер происходит подключение к серверу, получение результатов или выполнения транзакций запроса и отключение. Таким образом записи блокируются только на время выполнения запроса, а не на время редактирования оной.
Почему бы и на клиентских программах реализовать подобный механизм? Вот и редактируйте себе сколь угодно длинные записи, сколько хочешь. И требования ACID не нарушены.
Другой вопрос, зачем держать в базе такие длинные записи? Если данные типа ntext, то не будет ли лучше реализовать бизнес-логику, где нижестоящий не может редактировать поле записи, пока выставлен флаг редактирования этого поля вышестоящим начальником? А сервер пусть занимается своим делом?
12 фев 03, 07:53    [126903]     Ответить | Цитировать Сообщить модератору
 Re: ADO & SQL Server , блокировка записей  [new]
Mike Evteev
Member

Откуда:
Сообщений: 573
>Я вот не просекаю....
>Начал транзакцию с update, ну или select from T(updatelock) - заблокировал >запись, хорошо.
>Теперь второй юзер пытается тот же документ поредактировать - выдает >update, и чё будет? А будет энтот юзер ожидать сонца транзакции 1-го юзера.
>И никак ты ему ничё не выдашь на экран, разве что вылетит прога по >таймауту...
Спрашивали как заблокировать...
Отлуп конечно по таймауту... Дык его ведь и контролировать можно.
12 фев 03, 08:58    [126927]     Ответить | Цитировать Сообщить модератору
 Re: ADO & SQL Server , блокировка записей  [new]
Артем1
Member

Откуда: www.desnogorsk.{ru||net} -> Москва
Сообщений: 2036
Может, это?
12 фев 03, 09:25    [126945]     Ответить | Цитировать Сообщить модератору
 Re: ADO & SQL Server , блокировка записей  [new]
SeVa
Member [заблокирован]

Откуда: Москва
Сообщений: 4324
Работа проделана большая, но бесполезная.Это время лучше было бы
потратить на изучение матчасти и применить стандартные блокировки.
13 фев 03, 17:52    [128738]     Ответить | Цитировать Сообщить модератору
 Re: ADO & SQL Server , блокировка записей  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
>Работа проделана большая, но бесполезная.Это время лучше было бы
>потратить на изучение матчасти и применить стандартные блокировки.

Это ты про что конкретно.
13 фев 03, 17:56    [128745]     Ответить | Цитировать Сообщить модератору
 Re: ADO & SQL Server , блокировка записей  [new]
SeVa
Member [заблокирован]

Откуда: Москва
Сообщений: 4324
SET TRANSACTION ISOLATION LEVEL READ COMMITTED
BEGIN TRAN

SELECT *
FROM Docs WITH (READPAST,UPDLOCK,ROWLOCK)
WHERE DocID = @docid

IF @@ROWCOUNT = 0
BEGIN
COMMIT
RETURN -1
END
13 фев 03, 18:45    [128790]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить