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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

Если блокировка исключительная (а именно о ней речь), то READPAST никак не поможет. READPAST позволяет обойти только блокировки обновления и то только в тот момент, когда фактичекого обновления заблокированных строк ещё не произошло (в момент фактического обновления блокировка обновления заменяется на исключительную)
...
Рейтинг: 0 / 0
11.11.2002, 14:23
    #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
11.11.2002, 16:10
    #32066561
-=Extreme=-ShamaN
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как открыть набор данных с полной!!! блокировкой отобранных записей
Всем огромное спасибо! Я уже сам во всём разобрался
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как открыть набор данных с полной!!! блокировкой отобранных записей / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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