Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Как открыть набор данных с полной!!! блокировкой отобранных записей
|
|||
|---|---|---|---|
|
#18+
Собственно Subj :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2002, 14:49 |
|
||
|
Как открыть набор данных с полной!!! блокировкой отобранных записей
|
|||
|---|---|---|---|
|
#18+
Да, забыл упомянуть, используются ADO-компоненты Delphi 5.0 (SP1) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2002, 15:00 |
|
||
|
Как открыть набор данных с полной!!! блокировкой отобранных записей
|
|||
|---|---|---|---|
|
#18+
Чтобы многопользовательское приложение враз стало однопользовательским? Очень странное желание. На MSSQL это делается так (один из вариантов): BEGIN TRAN SELECT ... FROM SomeTable (XLOCK, PAGLOCK, HOLDLOCK) .... и блокировка будет держаться, пока COMMIT или ROLLBACK не скажешь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2002, 15:17 |
|
||
|
Как открыть набор данных с полной!!! блокировкой отобранных записей
|
|||
|---|---|---|---|
|
#18+
Наверное я вопрос некорректно поставил: запрос вида 'select TOP 1 from <table_name> where Status is Null'. Блокировка нужна именно на отобранные данные (эта 1 row, а не вся таблица!) Какая последовательность операторов Делфи для соединения, отбора, блокировки и удержиния оной должна быть??? Если можно в чистом коде Делфи... Премного благодарен... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2002, 15:25 |
|
||
|
Как открыть набор данных с полной!!! блокировкой отобранных записей
|
|||
|---|---|---|---|
|
#18+
Блокировками сервер рулит, поэтому забудь про операторы Delphi. Блокировка одной записи: BEGIN TRAN SELECT TOP 1 ... FROM SomeTable (XLOCK, ROWLOCK, HOLDLOCK) ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2002, 15:33 |
|
||
|
Как открыть набор данных с полной!!! блокировкой отобранных записей
|
|||
|---|---|---|---|
|
#18+
>Блокировками сервер рулит, поэтому забудь про >операторы Delphi. >Блокировка одной записи: >BEGIN TRAN >SELECT TOP 1 ... FROM SomeTable (XLOCK, ROWLOCK, >HOLDLOCK) ... Хорошо, а как же операторы BeginTrans, CommitTrans и RollbackTrans??? И какова последовательность предшествующих операторов Delphi для того, чтобы держать данную блокировку активной и как её потом снять (эту блокировку)??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2002, 15:54 |
|
||
|
Как открыть набор данных с полной!!! блокировкой отобранных записей
|
|||
|---|---|---|---|
|
#18+
Хорошо, а как же операторы BeginTrans, CommitTrans и RollbackTrans??? Ты думаешь, они что-то особенное делают? Они посылают на сервере те же самые BEGIN TRAN, COMMIT и ROLLBACK и ничего более. Ты уперся в желание получить блокировку средствами Delphi. Это совершенно тупиковый путь, если не знать как sql-сервер управляет транзакциями и блокировками. А если знать, то соотв. "средства Delphi" становятся не нужны, так как являются чистейшим overhead'ом над вызовом соответствующих средств sql-сервера, да к тому же еще и в кастрированом виде. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2002, 17:38 |
|
||
|
Как открыть набор данных с полной!!! блокировкой отобранных записей
|
|||
|---|---|---|---|
|
#18+
гЫ-гЫ) Кастрированном =) Хех!!! Кстати, XLOCK и PAGLOCK не работают вместе! Да, а пропускать блокированные записи - readpast'ом??? Всё-равно не работает (если даже так!) И вообще тогда вопрос: ведь begin transaction работает только на протяжении активного соединения с сервером SQL (собственно и блокирование будет столько же длится) + незавершение транзакции commit transaction? Его поддерживать можно только с установленным в компонентах серверным курсором (CursorLocation := clUseServer)? Или как-то ещё надо что-то делать? И какой тип курсора устанавливать для всего этого? (я про CursorType) P.S.: я работаю через TADODataset и соотв. через его вышеуказанные свойства... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.11.2002, 17:56 |
|
||
|
Как открыть набор данных с полной!!! блокировкой отобранных записей
|
|||
|---|---|---|---|
|
#18+
Кстати, XLOCK и PAGLOCK не работают вместе! Не знаю, почему у тебя не работают. У меня работают. Да, а пропускать блокированные записи - readpast'ом??? Не получится. Я предупреждал - блокирование приведет к однопользовательскому режиму. И вообще тогда вопрос: ведь begin transaction работает только на протяжении активного соединения с сервером SQL (собственно и блокирование будет столько же длится) + незавершение транзакции commit transaction? Транзакция будет существать на протяжении существования коннекта (пока AdoConnection является Active), если не сделать COMMIT или ROLLBACK Его поддерживать можно только с установленным в компонентах серверным курсором (CursorLocation := clUseServer)? Или как-то ещё надо что-то делать? И какой тип курсора устанавливать для всего этого? (я про CursorType) Только клиентский. Серверный курсор тоже может работать как ожидается, но есть вероятность появления глюков. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2002, 10:00 |
|
||
|
Как открыть набор данных с полной!!! блокировкой отобранных записей
|
|||
|---|---|---|---|
|
#18+
2Dankov все таки Вы не совсем правы, READPAST действительно позволит получит строки которые на данный момент не заблокированы, не ожидая окончания блокирующей транзакции. Поэтому однопользовательским, приложение не станет. 2-=Extreme=-ShamaN Вообще то я не встречался с ситуаций когда пользователю не выводятся блокированные строки, поэтому мне кажется, Ваш подход не совсем верным, обычно выводят все строки, а вот действия уже, действительно, производят с неизменившемися после прочтения строками. Пример - железнодорожные и авиа кассы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2002, 11:04 |
|
||
|
Как открыть набор данных с полной!!! блокировкой отобранных записей
|
|||
|---|---|---|---|
|
#18+
READPAST действительно позволит получит строки которые на данный момент не заблокированы, не ожидая окончания блокирующей транзакции. Поэтому однопользовательским, приложение не станет. Если блокировка исключительная (а именно о ней речь), то READPAST никак не поможет. READPAST позволяет обойти только блокировки обновления и то только в тот момент, когда фактичекого обновления заблокированных строк ещё не произошло (в момент фактического обновления блокировка обновления заменяется на исключительную) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2002, 13:48 |
|
||
|
Как открыть набор данных с полной!!! блокировкой отобранных записей
|
|||
|---|---|---|---|
|
#18+
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. исполняем код, и в другом окне QA выполняем другой код: Код: plaintext 1. 2. Так вот в течении 10 секунд мы не сможем получить строку с test_id = 2, но при этом не будем ждать завершения первой транзакции. P.S. Моё отношение к данному методу я уже высказал P.P.S Вообще то мне кажется что дальнейшее обсуждение, если оно будет, надо переносить в другой форум (SQL Server), а то как то не по теме... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2002, 14:23 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=32066180&tid=2119674]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
100ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 197ms |

| 0 / 0 |
