|
04.11.2009, 23:13 | #1 |
Участник
|
Есть код в кодеюните 5802:
[sql] WITH LedgEntryDim DO BEGIN SETRANGE("Table ID",DATABASE::"Value Entry"); SETRANGE("Entry No.",ValueEntryNo); IF FIND('-') THEN REPEAT IF NOT TempDimBufIn.GET("Table ID","Entry No.","Dimension Code") THEN BEGIN TempDimBufIn.INIT; TempDimBufIn."Table ID" := "Table ID"; TempDimBufIn."Entry No." := "Entry No."; TempDimBufIn."Dimension Code" := "Dimension Code"; TempDimBufIn."Dimension Value Code" := "Dimension Value Code"; TempDimBufIn.INSERT; END; UNTIL NEXT = 0; END; IF TempDimBufIn.FIND('-') THEN BEGIN DimEntryNo := DimBufMgt.FindDimensions(TempDimBufIn); IF DimEntryNo = 0 THEN DimEntryNo := DimBufMgt.InsertDimensions(TempDimBufIn); END ELSE DimEntryNo := 0; EXIT(DimEntryNo);[/sql] По монитору клиента вижу что: [sql]IF FIND('-') THEN SELECT * FROM "CRONUS Россия ЗАО$Ledger Entry Dimension" WITH (UPDLOCK) WHERE (("Table ID"=?)) AND (("Entry No_"=?)) ORDER BY "Table ID","Entry No_","Dimension Code" Clustered Index Seek(CRONUS Россия ЗАО$Ledger Entry Dimension$0)[2,1] Table ID,Entry No.,Dimension Code ID: 1225;New;Prepared;Dynamic;Rows: 1;UpdateNoLocks [/sql] Возникает вопрос, как сделать чтобы запрос был с READUNCOMMITTED, а не с UPDLOCK ? FINDSET(FALSE, FALSE) пробовал - результат тот же, никак не могу понять где порылась собака. Помогите кто умеет.... |
|
05.11.2009, 00:01 | #2 |
Участник
|
Цитата:
Специально пепепроверил на своей базе: READUNCOMMITTED. SELECT * FROM "CRONUS Россия ЗАО$Ledger Entry Dimension" WITH (READUNCOMMITTED) WHERE (("Table ID"=5802)) ORDER BY "Table ID","Entry No_","Dimension Code" ................... UPDLOCK может возникнуть в 4 случаях: 1. либо происходит modify на запись. 2. либо предусмотрительно лочите таблицу (повышаете уровень изоляции с READUNCOMMITTED до UPDLOCK; 3. либо FINDSET(TRUE,FALSE). В этом случае LOCKTABLE устанавливается автоматически и данные лочатся. Рекоммендуется на большом наборе данных. 3-й случай - это, по сути, замена двух последовательных операторов LOCKTABLE; FINDSET на один FINDSET(TRUE,FALSE) 4. либо FINDSET(TRUE,TRUE) LOCKTABLE в 5802 не встречается, по ссылке тоже данный рекорд не передается и до этого нигде не лочится FINDSET'ами. UPDLOCK просто физически не должно быть... У вас кодэюнит не перелопачен ручками? |
|
05.11.2009, 12:17 | #3 |
Участник
|
В том то и дело, стандартный Кронус без модификаций...
|
|
06.11.2009, 08:56 | #4 |
Участник
|
Учет с/с автоматический? Тогда в 22-ом CU делается вставка в эту таблицу, что повышает уровень изоляции.
Если не автоматический, то нужно разбираться в этом кодеюните, скорее всего он сам повышает уровень изоляции через GenJnlPostLine.RunWithCheck. |
|
06.11.2009, 12:41 | #5 |
Участник
|
То есть где то должен быть locktable или findset(true,....)?
Я правильно вас понимаю? Уровень изоляции повышается для одной таблицы? Учет в ручном режиме. |
|
06.11.2009, 14:39 | #6 |
Участник
|
Нет, где-то (а точнее в 12-ом CU) есть INSERT в эту таблицу. Ведь измерения к фин. книге, которые создает фин. учет хранятся в этой же таблице.
При LOCKTABLE - для одной. |
|