Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Топик располагается на нескольких страницах: [1] 2 вперед Ctrl→ все |
Zeppelin
Guest |
Пожалуйста, подскажите как правильно обеспечить
блокировку записей. Суть проблемы: Используется Provider=MSDataShape, и как я понимаю он может использовать только adLockBatchOptimistic. Две клиентских программы одновременно изменяют одни и те же записи (строчки накладной). Если в первой программе удалили строчку (равно как и изменили), и во второй вызвать UpdateBatch - возникает ошибка. т.е: возникает ситуация: когда 1-й и 2-й пользователь одновременно редактируют одну и ту же длинную- предлинную накладную неуспевший подтвердить изменения получает фигу . |
6 фев 03, 14:36 [123393] Ответить | Цитировать Сообщить модератору |
Pavel Member Откуда: Кемерово Сообщений: 2435 |
Клиентским курсором эта ситуация нерешаема. Возможно имеет смысл реализовать собственную систему блокировки. |
6 фев 03, 14:40 [123403] Ответить | Цитировать Сообщить модератору |
Артем1 Member Откуда: www.desnogorsk.{ru||net} -> Москва Сообщений: 2036 |
Может, попробовать забирать строчки на изменение select-ом без блокировки, а изменения отсылать отдельной коммандой для каждой строки накладной? У меня была похожая проблема. Этот способ помог. |
6 фев 03, 14:44 [123412] Ответить | Цитировать Сообщить модератору |
pkarklin Member Откуда: Москва (Муром) Сообщений: 74925 |
Уж сколько раз твердили миру: Блокировками в архитектуре клиент/сервер пусть занимается сервер.
Ну реализуйте вы бизнес-логике своей системы функциональность, при которой любой пользователь, который открывает документ, уже открытй другим пользователем, получал документ "только для чтения" с и информацией о том, что документ открыт тогда-то, пользователем таким-то, с рабочей станцией такой-то. У меня вся система докуменооборота на этом построена! |
6 фев 03, 14:49 [123421] Ответить | Цитировать Сообщить модератору |
Zeppelin
Guest |
А чё сказать тогда второму юзеру? |
6 фев 03, 17:55 [123708] Ответить | Цитировать Сообщить модератору |
pkarklin Member Откуда: Москва (Муром) Сообщений: 74925 |
Тоже самое. Лучше, чем механизм блокировок SQL Server вряд ли он придумает. |
6 фев 03, 18:01 [123718] Ответить | Цитировать Сообщить модератору |
Crip Member Откуда: Сообщений: 2490 |
Интересно знать каким образом это все реализовано? Хотя бы в общих чертах? Просто я плохо представляю нормальную блокировку документа без использования 3-х звенки. Что допустим, происходит, если клиент работующий с документом по каким -то причинам "отваливается"? |
6 фев 03, 18:13 [123730] Ответить | Цитировать Сообщить модератору |
pkarklin Member Откуда: Москва (Муром) Сообщений: 74925 |
Все реализовано на двухзвенке. Долго рожал такой механизм. Поэтому деталями делиться не буду. |
6 фев 03, 18:23 [123743] Ответить | Цитировать Сообщить модератору |
Pavel Member Откуда: Кемерово Сообщений: 2435 |
Все реализовано на двухзвенке. Долго рожал такой механизм. Поэтому деталями делиться не буду.
Лучше бы ты промолчал, замученный родами. Мне, лично, сильно пофигу что ты там у себя наваял, но гордись этим молча. Не знаю как насчет других участникоф форума, а от меня теперь уж точно помощи не жди. |
6 фев 03, 20:18 [123837] Ответить | Цитировать Сообщить модератору |
Белов Владимир Member Откуда: Москва Сообщений: 1716 |
А клиент на чем написан ? |
6 фев 03, 20:47 [123856] Ответить | Цитировать Сообщить модератору |
Белов Владимир Member Откуда: Москва Сообщений: 1716 |
>pkarklin
ИМХО, Вы не правы. |
6 фев 03, 20:47 [123857] Ответить | Цитировать Сообщить модератору |
Mike Evteev Member Откуда: Сообщений: 573 |
Как насчет начинать транзакцию с update?
Тогда все остальные пользователи будуть получать отлуп. Не так уж и сложно, а? |
6 фев 03, 23:49 [123898] Ответить | Цитировать Сообщить модератору |
ADO
Guest |
>>А чё сказать тогда второму юзеру?
Сказать, что запись изменяет ему с другим юзером. |
7 фев 03, 00:31 [123910] Ответить | Цитировать Сообщить модератору |
Дамир
Guest |
Я вот не просекаю....
Начал транзакцию с update, ну или select from T(updatelock) - заблокировал запись, хорошо. Теперь второй юзер пытается тот же документ поредактировать - выдает update, и чё будет? А будет энтот юзер ожидать сонца транзакции 1-го юзера. И никак ты ему ничё не выдашь на экран, разве что вылетит прога по таймауту... |
7 фев 03, 07:55 [123957] Ответить | Цитировать Сообщить модератору |
pkarklin Member Откуда: Москва (Муром) Сообщений: 74925 |
To Pavel
Вот тока грубить не надо. Если тебя задел мой отказ делиться решением, то ето твои личные проблемы. Я посмотрю, как ты будешь мучаться в родах, рожая свою систему блокировок. То Zeppelin вот что я использую: 1. Создаем таблицу следующей структуры:
Создаем хп:
Права на выполнение даем public. Это все на серверной части. Осталось только в нужные места клиентских приложений включить соответствующие вызовы. При отваливании клиента (что проверялось разными способами, например, грубое вырубание машин) максимальное время подвисания процесса 5 секунд. |
||||
7 фев 03, 08:21 [123964] Ответить | Цитировать Сообщить модератору |
Crip Member Откуда: Сообщений: 2490 |
Вообщем понятно... Все основано на sp_who... Это недостаточно надежно... |
7 фев 03, 09:39 [124001] Ответить | Цитировать Сообщить модератору |
Crip Member Откуда: Сообщений: 2490 |
Хотя я немного погорячился... Нормальное решение, просто оно совсем не ново, зато какие пафосные замечания... |
7 фев 03, 09:41 [124003] Ответить | Цитировать Сообщить модератору |
Zeppelin
Guest |
to pkarklin
Спасибо , попробую твой вариант. О результатах обязательно сообщу. |
7 фев 03, 10:18 [124054] Ответить | Цитировать Сообщить модератору |
Pavel Member Откуда: Кемерово Сообщений: 2435 |
2 Zeppelin
Вот тока грубить не надо. Теперь не буду. Если тебя задел мой отказ делиться решением, то ето твои личные проблемы. Ну так поделился же. Я посмотрю, как ты будешь мучаться в родах, рожая свою систему блокировок. А предложеннвй тобой способ не является реализацией системы блокировок на уровне документа, Т.е. собственной системой блокировок? |
7 фев 03, 10:35 [124079] Ответить | Цитировать Сообщить модератору |
Axl Dead
Guest |
Может и глупый вопрос, но всё же...
При реализации запросов любого вида (SELECT, INSERT, UPDATE, DELETE) через браузер происходит подключение к серверу, получение результатов или выполнения транзакций запроса и отключение. Таким образом записи блокируются только на время выполнения запроса, а не на время редактирования оной. Почему бы и на клиентских программах реализовать подобный механизм? Вот и редактируйте себе сколь угодно длинные записи, сколько хочешь. И требования ACID не нарушены. Другой вопрос, зачем держать в базе такие длинные записи? Если данные типа ntext, то не будет ли лучше реализовать бизнес-логику, где нижестоящий не может редактировать поле записи, пока выставлен флаг редактирования этого поля вышестоящим начальником? А сервер пусть занимается своим делом? |
12 фев 03, 07:53 [126903] Ответить | Цитировать Сообщить модератору |
Mike Evteev Member Откуда: Сообщений: 573 |
>Я вот не просекаю....
>Начал транзакцию с update, ну или select from T(updatelock) - заблокировал >запись, хорошо. >Теперь второй юзер пытается тот же документ поредактировать - выдает >update, и чё будет? А будет энтот юзер ожидать сонца транзакции 1-го юзера. >И никак ты ему ничё не выдашь на экран, разве что вылетит прога по >таймауту... Спрашивали как заблокировать... Отлуп конечно по таймауту... Дык его ведь и контролировать можно. |
12 фев 03, 08:58 [126927] Ответить | Цитировать Сообщить модератору |
Артем1 Member Откуда: www.desnogorsk.{ru||net} -> Москва Сообщений: 2036 |
Может, это? |
12 фев 03, 09:25 [126945] Ответить | Цитировать Сообщить модератору |
SeVa Member [заблокирован] Откуда: Москва Сообщений: 4324 |
Работа проделана большая, но бесполезная.Это время лучше было бы
потратить на изучение матчасти и применить стандартные блокировки. |
13 фев 03, 17:52 [128738] Ответить | Цитировать Сообщить модератору |
pkarklin Member Откуда: Москва (Муром) Сообщений: 74925 |
>Работа проделана большая, но бесполезная.Это время лучше было бы
>потратить на изучение матчасти и применить стандартные блокировки. Это ты про что конкретно. |
13 фев 03, 17:56 [128745] Ответить | Цитировать Сообщить модератору |
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 | ![]() |