|
Rows as Needed + MS SQL = Lock all table
|
|||
---|---|---|---|
#18+
Со мной случилось страшное. В приложении все окна сделаны по одному типу: открываешь окно-список (grid datawindow) с Rows as Needed. Кликаешь два раза на строчку и выползает форма с детальной информацией для редактирования (form datawindow). Вообщем почти как 1С, только без деревьев. Всё это прекрасно работало под Sybase. Но стоило перетащить приложение на MS SQL и оно сразу же отказалось работать. Проблема в следующем: Пока grid datawindow с Rows as Needed не дочитает строчки до конца, невозможно редактировать формы, т.к. MS SQL лочит записи на время чтения. Что можно придумать в такой ситуации? Или идти вешаться? :-((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((( ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2004, 11:27 |
|
Rows as Needed + MS SQL = Lock all table
|
|||
---|---|---|---|
#18+
В MS SQL есть ключевое слово NOLOCK. Может его вставить в текст запроса ? Например , Исх запрос : select A , B , C from T Преобразовать к : select A , B , C from T (nolock) ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2004, 11:51 |
|
Rows as Needed + MS SQL = Lock all table
|
|||
---|---|---|---|
#18+
Навряд NOLOCK поможет,т.к. as needed переделывает select в курсор,и дело в разнице курсорных,а не селектных блокировок SYBASE и MSSQL. Всё надо передумывать.Я бы,наверное,ввёл бы поле identity у ведущей таблы и по PageDown/PageUP менял бы where.Своего рода as needed. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2004, 12:00 |
|
Rows as Needed + MS SQL = Lock all table
|
|||
---|---|---|---|
#18+
ВовикВ MS SQL есть ключевое слово NOLOCK. Может его вставить в текст запроса ? Например , Исх запрос : select A , B , C from T Преобразовать к : select A , B , C from T (nolock) Спасибо большое, помогло! Единственный минус такого решения - то что в каждый селект придется дописать фразу "WITH (NOLOCK)". KOLCHOZ_POSTEVENT Навряд NOLOCK поможет,т.к. as needed переделывает select в курсор,и дело в разнице курсорных,а не селектных блокировок SYBASE и MSSQL. Всё надо передумывать.Я бы,наверное,ввёл бы поле identity у ведущей таблы и по PageDown/PageUP менял бы where.Своего рода as needed. Да уж... Но where менять это крайне геморойное решение.... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2004, 12:55 |
|
Rows as Needed + MS SQL = Lock all table
|
|||
---|---|---|---|
#18+
Louder Спасибо большое, помогло! Единственный минус такого решения - то что в каждый селект придется дописать фразу "WITH (NOLOCK)". Хочу вас огорчить, это не единственный минус данного решения, и при том не самый большой. Вот что в статье Locking Hints в BOL про него пишут: Do not issue shared locks and do not honor exclusive locks. When this option is in effect, it is possible to read an uncommitted transaction or a set of pages that are rolled back in the middle of a read . Dirty reads are possible. Only applies to the SELECT statement. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2004, 13:27 |
|
Rows as Needed + MS SQL = Lock all table
|
|||
---|---|---|---|
#18+
Да, вот еще кусочек из BOL из статьи Declare Cursor OPTIMISTIC Specifies that positioned updates or deletes made through the cursor do not succeed if the row has been updated since it was read into the cursor. SQL Server does not lock rows as they are read into the cursor . It instead uses comparisons of timestamp column values, or a checksum value if the table has no timestamp column, to determine whether the row was modified after it was read into the cursor. If the row was modified, the attempted positioned update or delete fails. OPTIMISTIC cannot be specified if FAST_FORWARD is also specified Ну там и еще есть что почитать.. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2004, 13:46 |
|
Rows as Needed + MS SQL = Lock all table
|
|||
---|---|---|---|
#18+
Локшин МаркХочу вас огорчить, это не единственный минус данного решения, и при том не самый большой. Вот что в статье Locking Hints в BOL про него пишут: Do not issue shared locks and do not honor exclusive locks. When this option is in effect, it is possible to read an uncommitted transaction or a set of pages that are rolled back in the middle of a read . Dirty reads are possible. Only applies to the SELECT statement. Спасибо, Марк. Собственно мне главное, чтобы update прошел в детальной форме. Проблема грязного чтения не так беспокоит. Конечно не красиво всё это, но лучшего решения всё равно нет. Качать пару миллионов записей на клиента тоже не выход... ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2004, 15:22 |
|
Rows as Needed + MS SQL = Lock all table
|
|||
---|---|---|---|
#18+
авторКонечно не красиво всё это, но лучшего решения всё равно нет. Ну так можно же добиться, чтобы курсор не блокировал данные и без грязного чтения. авторКачать пару миллионов записей на клиента тоже не выход... А каким образом у вас выборка оказалась на несколько миллионов записей? Как тогда по ней навигация происходит? Может следует подумать о том, чтобы добавить пару условий в WHERE? ... |
|||
:
Нравится:
Не нравится:
|
|||
19.07.2004, 15:47 |
|
Rows as Needed + MS SQL = Lock all table
|
|||
---|---|---|---|
#18+
Локшин Марк Ну так можно же добиться, чтобы курсор не блокировал данные и без грязного чтения. Как добиться? PB сам генерит курсор, я же никак на это повлиять не могу :( Локшин Марк А каким образом у вас выборка оказалась на несколько миллионов записей? Как тогда по ней навигация происходит? Может следует подумать о том, чтобы добавить пару условий в WHERE? Конечно такая ситуация возникает редко, но всё-же может быть. Условие WHERE пользователь добавляет сам, если хочет, в Datawindow Query mode. Да даже если не на несколько миллионов, а на пару тысяч - нехорошо качать на клиент все записи сразу. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.07.2004, 18:16 |
|
Rows as Needed + MS SQL = Lock all table
|
|||
---|---|---|---|
#18+
авторКак добиться? PB сам генерит курсор, я же никак на это повлиять не могу :( Погодите, по-моему вы вводите меня в заблуждение. PB никакой курсор не генерирует, он просто отправляет запрос, и докачивает выборку по мере надобности. По крайней мере так все выглядит в Profiler'е. Если бы он действительно делал курсор, его можно было бы на SQLPreview перехватить и подкорректировать. Отсюда еще одна идея - сделать курсор самому и самому его докачивать, по мере необходимости. авторДа даже если не на несколько миллионов, а на пару тысяч - нехорошо качать на клиент все записи сразу. Если вся выборка на клиенте, то с ней легче работать - искать, фильтровать, ScrollBar отображать :). Так что порядка 1000 записей можно подумать чтобы и откачать. Выбор подхода сильно зависит от количиства пользователей и скорости передачи данных. Другое дело, что интерфейс надо проектировать, чтобы записи десятками тысяч не сыпались на клиента. Ну что он с такой выборкой потом делать будет? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.07.2004, 10:53 |
|
Rows as Needed + MS SQL = Lock all table
|
|||
---|---|---|---|
#18+
Локшин МаркПогодите, по-моему вы вводите меня в заблуждение. PB никакой курсор не генерирует, он просто отправляет запрос, и докачивает выборку по мере надобности. По крайней мере так все выглядит в Profiler'е. Если бы он действительно делал курсор, его можно было бы на SQLPreview перехватить и подкорректировать. Отсюда еще одна идея - сделать курсор самому и самому его докачивать, по мере необходимости. Да, в профайлере я тоже курсора не увидел. В "Advanced PowerBuilder Techniques" написанно так: "...PowerBuilder implements Retrieve As Needed implementing a cursor and maintaining the cursor as rows are retrieved from the server. When data is needed on the client, PowerBilder simply fetches enough rows from the server." Да и как же он без курсора будет докачивать? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.07.2004, 15:48 |
|
|
start [/forum/topic.php?fid=15&fpage=102&tid=1338996]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
27ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 127ms |
0 / 0 |