powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Блокировка записи DELPHI 6 + ADO + MS SQL 2000
17 сообщений из 17, страница 1 из 1
Блокировка записи DELPHI 6 + ADO + MS SQL 2000
    #32149646
-=Extreme=-ShamaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Использую ADOConnection, ADOQuery:
запрос: select id from Table1 with (readpast);
курсор: серверный

ADOQuery.Open;
ADOQuery.First;

Должна выбранная запись заблокироваться, но этого не происходит (проверяется запуском второй копии данной программы)

Что не так делаю?
...
Рейтинг: 0 / 0
Блокировка записи DELPHI 6 + ADO + MS SQL 2000
    #32149674
-=Extreme=-ShamaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Неужели ни у кого не было подобных задач и проблем???
...
Рейтинг: 0 / 0
Блокировка записи DELPHI 6 + ADO + MS SQL 2000
    #32149680
Виктор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну ты хоть посмотри, в какой форум пишешь. Тут Oracle обсуждают, батенька :-))
...
Рейтинг: 0 / 0
Блокировка записи DELPHI 6 + ADO + MS SQL 2000
    #32149681
Виктор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Упс, сам проперся, не в том окне, ответил :-))
Сорри :-)
...
Рейтинг: 0 / 0
Блокировка записи DELPHI 6 + ADO + MS SQL 2000
    #32149698
andsm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Select не блокирует запись для других select-ов, т.е. поведение совершенно правильное. Если хочется заблокировать какую-то запись, напиши:
select id from Table1 with (updlock, holdlock) where ...;
...
Рейтинг: 0 / 0
Блокировка записи DELPHI 6 + ADO + MS SQL 2000
    #32149820
-=Extreme=-ShamaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2andsm : Хм... здрасти приехали: я и не говорю о том, что сам селект блокирует! Блокироваться должна только конкретная запись при выборе её с помощью средств компонент Delphi (ADO, к примеру) из полученного рекордсета при использовании (разумеется) серверного курсора!
...
Рейтинг: 0 / 0
Блокировка записи DELPHI 6 + ADO + MS SQL 2000
    #32149913
-=Extreme=-ShamaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Видать сложная проблема - никто реально помочь не может :(((
...
Рейтинг: 0 / 0
Блокировка записи DELPHI 6 + ADO + MS SQL 2000
    #32149919
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Видать сложная проблема - никто реально помочь не может :(((

Так сам себе придумал проблему, вот она и сложная. Зачем тебе серверный курсор. Зачем запись блокировать при выборке. Уходи от пессимистических блокировок на оптимистические.
...
Рейтинг: 0 / 0
Блокировка записи DELPHI 6 + ADO + MS SQL 2000
    #32150145
-=Extreme=-ShamaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2pkarklin :
Так сам себе придумал проблему, вот она и сложная.

Это не я себе её придумал, а стоящие передо мною задачи!

Зачем тебе серверный курсор. Зачем запись блокировать при выборке. Уходи от пессимистических блокировок на оптимистические.

Представь, есть база e-mail (к примеру), или ещё какая-нибудь база-очередь, нужно отправить все сообщения, находящиеся в ней, выбранные по одному и тому же запросу. Но есть одно но: иногда требуется (для ускорения процесса) запустить много копий одно и той же программы, кот. рассылает эту очередь.

Так вот чтобы не получилось повторных отправок из базы, требуется блокировать ТОЛЬКО требуемую запись от чтения и изменения для других транзакций!!!

Меня интересует реально работающие примеры кода для такого рода задач!
...
Рейтинг: 0 / 0
Блокировка записи DELPHI 6 + ADO + MS SQL 2000
    #32150189
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Представь, есть база e-mail (к примеру), или ещё какая-нибудь база-очередь, нужно отправить все сообщения, находящиеся в ней, выбранные по одному и тому же запросу. Но есть одно но: иногда требуется (для ускорения процесса) запустить много копий одно и той же программы, кот. рассылает эту очередь.

А что, стандартных почтовых серверов не хватет? И почему с клиента отправляешь, а не с сервера.

Должна выбранная запись заблокироваться, но этого не происходит

Это кто тебе сказал. Как твой SELECT отработал, так блокировки и снялись. Что б они остались висеть, надо транзакцию запускать. И курсор можно сделать локальным. Вот тока на клиенте это все делать как-то не правильно.
...
Рейтинг: 0 / 0
Блокировка записи DELPHI 6 + ADO + MS SQL 2000
    #32150217
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нда.
Это надо в процедуре открывать транзакцию, считывать сколько нужно строк, потом на них проставлять флажок о том, что ты их взял на отправку, потом закрывать транзакцию и отдавать селект этих записей - когда отправил, ставить, что отправлено
Другой клиент должен считывать записи без такого флажка - проблем то
...
Рейтинг: 0 / 0
Блокировка записи DELPHI 6 + ADO + MS SQL 2000
    #32150263
-=Extreme=-ShamaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А что, стандартных почтовых серверов не хватет? И почему с клиента отправляешь, а не с сервера.

Я же сказал - к примеру!!! На самом деле - отправляются не e-mail'ы, а происходят некоторые другие процессы, но ведь это не суть важно!

Это кто тебе сказал. Как твой SELECT отработал, так блокировки и снялись.

Ещё раз повторяю: я не говорил, что после того, как select отработал блокировки должны остаться сами по себе!!! Это я отлично понимаю, потому и говорил про транзакции!

Что б они остались висеть, надо транзакцию запускать.

И курсор можно сделать локальным. Вот тока на клиенте это все делать как-то не правильно.

Так вот и нужен мне серверный курсор, чтобы блокировка выбранной записи (row) была для всех, а не для локальной копии рекордсета (при клиентском курсоре)!

Я создаю новую транзакцию, делаю простой запрос select id from Table1 with (readpast), выбираю первую запись, получаю id, запускаю другую копию, делаю тоже самое, и получаю тот же самый id!!!

Вот в чём проблема!
...
Рейтинг: 0 / 0
Блокировка записи DELPHI 6 + ADO + MS SQL 2000
    #32150269
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так вот и нужен мне серверный курсор, чтобы блокировка выбранной записи (row) была для всех, а не для локальной копии рекордсета (при клиентском курсоре)!

Да почему ж серверный то. Хоть вообще не будь никакого курсора.

1. Begin Tran
2. SELECT... c хинтом HOLDLOCK, ROWLOCK
3. Чего то делаем
4. Сommit tran
...
Рейтинг: 0 / 0
Блокировка записи DELPHI 6 + ADO + MS SQL 2000
    #32151143
-=Extreme=-ShamaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кладу на форму нового проекта
Код: plaintext
1.
2.
3.
4.
5.
    ADOConnection1: TADOConnection;
    ADOQuery1: TADOQuery;
    Button1: TButton;
    Button2: TButton;
    Label1: TLabel;


Заполняю методы OnClick для двух кнопок:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
procedure TForm1.Button1Click(Sender: TObject);
var
 SQLString: string;
begin
 ADOConnection1.Open;
 ADOConnection1.BeginTrans;
 SQLString := 'select [PollID] from Poll1 with (HOLDLOCK, ROWLOCK)';
 ADOQuery1.SQL.Add(SQLString);
 ADOQuery1.Open;
 ADOQuery1.First;
 Label1.Caption := ADOQuery1.FieldByName('PollID').AsString;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 ADOQuery1.Close;
 ADOConnection1.RollbackTrans;
 ADOConnection1.Close;
 Label1.Caption := '';
end;


Никаких других параметров не изменял, кроме как создал ConnectionString до соотв. БД + username + password + default initial catalog... LoginPrompt поменял на False.

Делаю Build....

Запускаю 2 копии этого проекта (Project1.exe), жму Button1 на одном, выводит в Label1 цифру 1. Жму Button1 на другом, выводит в Label1 также цифру 1.

Вывод: НЕ РАБОТАЕТ твой пример!!! Во второй копии проекта должен был вывести PollID=2 (а не один)

Что я не так делаю?
...
Рейтинг: 0 / 0
Блокировка записи DELPHI 6 + ADO + MS SQL 2000
    #32151274
pkarklin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да мой то пример был продолжением поста tygra. В которой он предлагал проставить флажки. И потом работать тока с записями, флажки для которой проставлены. Select не заблокирует запись от другого селекта, пока ты в этой же транзакции UPDATE не сделаешь. Вот тогда другой select с хинтом readpast пропустит те записи, которые были изменены, но транзакция еще не зафиксирована.
...
Рейтинг: 0 / 0
Блокировка записи DELPHI 6 + ADO + MS SQL 2000
    #32151320
-=Extreme=-ShamaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
работает, если делать после select'а update той записи в этой же транзакции, кот. хочу заюзать, но мне кажется, что это какой-то некорректный подход к проблеме...
Буду думать... Если есть другие предложения - пишите сюда, в форум...
...
Рейтинг: 0 / 0
Блокировка записи DELPHI 6 + ADO + MS SQL 2000
    #32151695
Фотография tygra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уже показали единственное решение - чего еще? Садомазохизмом и извратом не занимаемся - поэтому ничего другого предложить не можем :)
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Блокировка записи DELPHI 6 + ADO + MS SQL 2000
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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