powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как открыть набор данных с полной!!! блокировкой отобранных записей
13 сообщений из 13, страница 1 из 1
Как открыть набор данных с полной!!! блокировкой отобранных записей
    #32066088
-=Extreme=-ShamaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Собственно Subj :)
...
Рейтинг: 0 / 0
Как открыть набор данных с полной!!! блокировкой отобранных записей
    #32066092
-=Extreme=-ShamaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, забыл упомянуть, используются ADO-компоненты Delphi 5.0 (SP1)
...
Рейтинг: 0 / 0
Как открыть набор данных с полной!!! блокировкой отобранных записей
    #32066104
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чтобы многопользовательское приложение враз стало однопользовательским? Очень странное желание.

На MSSQL это делается так (один из вариантов):

BEGIN TRAN
SELECT ... FROM SomeTable (XLOCK, PAGLOCK, HOLDLOCK) ....

и блокировка будет держаться, пока COMMIT или ROLLBACK не скажешь.
...
Рейтинг: 0 / 0
Как открыть набор данных с полной!!! блокировкой отобранных записей
    #32066110
-=Extreme=-ShamaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Наверное я вопрос некорректно поставил:
запрос вида 'select TOP 1 from <table_name> where Status is Null'.
Блокировка нужна именно на отобранные данные (эта 1 row, а не вся таблица!)
Какая последовательность операторов Делфи для соединения, отбора, блокировки и удержиния оной должна быть???
Если можно в чистом коде Делфи...
Премного благодарен...
...
Рейтинг: 0 / 0
Как открыть набор данных с полной!!! блокировкой отобранных записей
    #32066116
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Блокировками сервер рулит, поэтому забудь про операторы Delphi.

Блокировка одной записи:
BEGIN TRAN
SELECT TOP 1 ... FROM SomeTable (XLOCK, ROWLOCK, HOLDLOCK) ...
...
Рейтинг: 0 / 0
Как открыть набор данных с полной!!! блокировкой отобранных записей
    #32066125
-=Extreme=-ShamaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
>Блокировками сервер рулит, поэтому забудь про >операторы Delphi.

>Блокировка одной записи:
>BEGIN TRAN
>SELECT TOP 1 ... FROM SomeTable (XLOCK, ROWLOCK, >HOLDLOCK) ...

Хорошо, а как же операторы BeginTrans, CommitTrans и RollbackTrans???

И какова последовательность предшествующих операторов Delphi для того, чтобы держать данную блокировку активной и как её потом снять (эту блокировку)???
...
Рейтинг: 0 / 0
Как открыть набор данных с полной!!! блокировкой отобранных записей
    #32066180
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хорошо, а как же операторы BeginTrans, CommitTrans и RollbackTrans???

Ты думаешь, они что-то особенное делают? Они посылают на сервере те же самые BEGIN TRAN, COMMIT и ROLLBACK и ничего более.

Ты уперся в желание получить блокировку средствами Delphi. Это совершенно тупиковый путь, если не знать как sql-сервер управляет транзакциями и блокировками. А если знать, то соотв. "средства Delphi" становятся не нужны, так как являются чистейшим overhead'ом над вызовом соответствующих средств sql-сервера, да к тому же еще и в кастрированом виде.
...
Рейтинг: 0 / 0
Как открыть набор данных с полной!!! блокировкой отобранных записей
    #32066192
-=Extreme=-ShamaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
гЫ-гЫ) Кастрированном =)
Хех!!! Кстати, XLOCK и PAGLOCK не работают вместе!

Да, а пропускать блокированные записи - readpast'ом???

Всё-равно не работает (если даже так!)

И вообще тогда вопрос: ведь begin transaction работает только на протяжении активного соединения с сервером SQL (собственно и блокирование будет столько же длится) + незавершение транзакции commit transaction? Его поддерживать можно только с установленным в компонентах серверным курсором (CursorLocation := clUseServer)? Или как-то ещё надо что-то делать?

И какой тип курсора устанавливать для всего этого?
(я про CursorType)

P.S.: я работаю через TADODataset и соотв. через его вышеуказанные свойства...
...
Рейтинг: 0 / 0
Как открыть набор данных с полной!!! блокировкой отобранных записей
    #32066310
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, XLOCK и PAGLOCK не работают вместе!

Не знаю, почему у тебя не работают. У меня работают.

Да, а пропускать блокированные записи - readpast'ом???

Не получится. Я предупреждал - блокирование приведет к однопользовательскому режиму.

И вообще тогда вопрос: ведь begin transaction работает только на протяжении активного соединения с сервером SQL (собственно и блокирование будет столько же длится) + незавершение транзакции commit transaction?

Транзакция будет существать на протяжении существования коннекта (пока AdoConnection является Active), если не сделать COMMIT или ROLLBACK

Его поддерживать можно только с установленным в компонентах серверным курсором (CursorLocation := clUseServer)? Или как-то ещё надо что-то делать?
И какой тип курсора устанавливать для всего этого?
(я про CursorType)


Только клиентский. Серверный курсор тоже может работать как ожидается, но есть вероятность появления глюков.
...
Рейтинг: 0 / 0
Как открыть набор данных с полной!!! блокировкой отобранных записей
    #32066354
fima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Dankov все таки Вы не совсем правы, READPAST действительно позволит получит строки которые на данный момент не заблокированы, не ожидая окончания блокирующей транзакции. Поэтому однопользовательским, приложение не станет.
2-=Extreme=-ShamaN Вообще то я не встречался с ситуаций когда пользователю не выводятся блокированные строки, поэтому мне кажется, Ваш подход не совсем верным, обычно выводят все строки, а вот действия уже, действительно, производят с неизменившемися после прочтения строками. Пример - железнодорожные и авиа кассы.
...
Рейтинг: 0 / 0
Как открыть набор данных с полной!!! блокировкой отобранных записей
    #32066453
Фотография ziktuw
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
READPAST действительно позволит получит строки которые на данный момент не заблокированы, не ожидая окончания блокирующей транзакции. Поэтому однопользовательским, приложение не станет.

Если блокировка исключительная (а именно о ней речь), то READPAST никак не поможет. READPAST позволяет обойти только блокировки обновления и то только в тот момент, когда фактичекого обновления заблокированных строк ещё не произошло (в момент фактического обновления блокировка обновления заменяется на исключительную)
...
Рейтинг: 0 / 0
Как открыть набор данных с полной!!! блокировкой отобранных записей
    #32066489
fima
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Dankov Совершенно верно, с HOLDLOCK READPAST не поможет. Но -=Extreme=-ShamaN, насколько я понял, хочет не исключительных блокировок, а защитить уже выбранные записи, от повторного выбора. Так вот, READPAST, поможет решить проблемму. Чтобы не быть голословным, вот пример:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
use pubs
go
if object_id('test') is null
begin
	create table test
	(
		test_id integer identity not null,
		test_string varchar ( 32 ) not null,
	)
	insert into test (test_string) values ('1')
	insert into test (test_string) values ('2')
	insert into test (test_string) values ('3')
end
begin tran 
select * 
from test (xlock, rowlock)
where test_id =  2 
update test
set test_string = 'новое значение'
where test_id =  2 
waitfor delay '00:00:10.000'
commit transaction
drop table test

исполняем код, и в другом окне QA выполняем другой код:
Код: plaintext
1.
2.
select *
from test (readpast)

Так вот в течении 10 секунд мы не сможем получить строку с test_id = 2, но при этом не будем ждать завершения первой транзакции.
P.S. Моё отношение к данному методу я уже высказал
P.P.S Вообще то мне кажется что дальнейшее обсуждение, если оно будет, надо переносить в другой форум (SQL Server), а то как то не по теме...
...
Рейтинг: 0 / 0
Как открыть набор данных с полной!!! блокировкой отобранных записей
    #32066561
-=Extreme=-ShamaN
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем огромное спасибо! Я уже сам во всём разобрался
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как открыть набор данных с полной!!! блокировкой отобранных записей
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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