Переключение на Главную Страницу Страницы: 1 2 3 [4]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Как обойти блокировку таблиц итогов по регистрам RG####? (число прочтений - 10560 )
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #45 - 24. Сентября 2009 :: 11:33
Печать  
Цитата:
1. Ну нет же никаких "доп таблиц" в реализации блокировк опер. учета (доп. таблицы в бух. учете). В даном контексте есть лишь модифиц. таблица RG.

Для возникнования блокировки и даже взаимоблокиовки достаточно и одной таблицы
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #46 - 24. Сентября 2009 :: 11:36
Печать  
Цитата:
2. На счет "грязного чтения", да возможно, но стандартная процедура также с (NOLOCK).

ну тут ты тоже не совсем прав
в той же приведенной выше _1sp_RG99_Select
нет никаких хинтов.
Когда выполняешь стандартный запрос из модуля проведения
Запрос = СоздатьОбъект("Запрос"); тоже нет хинтов.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #47 - 24. Сентября 2009 :: 11:49
Печать  
Цитата:
3. Про блокировки - не поняимаю.

Давай примерчик без 1с.Чистый sql.
Смотри есть таблица  в тестовой базе
Код
Выбрать все
CREATE TABLE test_table (
id int  IDENTITY(1,1) ,
int_value  int   NOT NULL ,
CONSTRAINT PK0_test_table  PRIMARY KEY (Id)
)
 


В ней есть одна запись
(1,23)
1.Далее заходим в qa1 переключаемся на тестовую базу
2.Далее заходим в qa2 переключаемся на тестовую базу
3.В qa1 выполняем код
begin tran
update test_table set int_value = int_value + 20 where id =  1
код выполнился  видим зеленую стрелку
4 Переходим в qa2
выполняем код
begin tran
update test_table set int_value = int_value + 40 where id =  1
Код выполняется видим красный квадратик.
Все qa2 остановился на блокировке update индекса
И из этого состояния выйдет только после того как в qa1
либо завершим транзакцию либо от нее откажемся.
Сразу же после этого в qa2 увидим зеленую стрелочку.
Вот это и есть суть блокировки.


  
Наверх
 
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #48 - 24. Сентября 2009 :: 12:14
Печать  
Z1 писал(а) 24. Сентября 2009 :: 11:33:
Цитата:
1. Ну нет же никаких "доп таблиц" в реализации блокировк опер. учета (доп. таблицы в бух. учете). В даном контексте есть лишь модифиц. таблица RG.

Для возникнования блокировки и даже взаимоблокиовки достаточно и одной таблицы


Ок. Пример? Когда при инсете в табл. с индексом в котором есть поле с инкрементом может возникнуть взаимоблок.? Да есть время перестройки индекса, но этого не избежать, и это весьма маловероятно.
  
Наверх
ICQ  
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #49 - 24. Сентября 2009 :: 12:22
Печать  
Z1 писал(а) 24. Сентября 2009 :: 11:36:
Цитата:
2. На счет "грязного чтения", да возможно, но стандартная процедура также с (NOLOCK).

ну тут ты тоже не совсем прав
в той же приведенной выше _1sp_RG99_Select
нет никаких хинтов.
Когда выполняешь стандартный запрос из модуля проведения
Запрос = СоздатьОбъект("Запрос"); тоже нет хинтов.


1. В "_1sp_RG99_Select" - нет хинта.
2. В "Запрос = СоздатьОбъект("Запрос")" - есть хинт (у меня есть).

Будем дальше спорить? Представь текст запроса который уходит на сервер при
Код
Выбрать все
Запрос.Выполнить(ТекЗап) 


.
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #50 - 24. Сентября 2009 :: 12:27
Печать  
chicago писал(а) 24. Сентября 2009 :: 12:14:
Z1 писал(а) 24. Сентября 2009 :: 11:33:
Цитата:
1. Ну нет же никаких "доп таблиц" в реализации блокировк опер. учета (доп. таблицы в бух. учете). В даном контексте есть лишь модифиц. таблица RG.

Для возникнования блокировки и даже взаимоблокиовки достаточно и одной таблицы


Ок. Пример? Когда при инсете в табл. с индексом в котором есть поле с инкрементом может возникнуть взаимоблок.? Да есть время перстройки индекса, но этого не избежать, и это весьма маловероятно.

Если все делают insert только в одну таблицу
взаимоблокировки не будет.
Если таблицы две то наверное может
Очень сильно зависит от уровня изоляции
Шаг1
Сесия1
begin tran
insert into tabl1

Шаг2
Сесия2
begin tran
insert into tabl2

Шаг3
Сесия1
insert into tabl2

Шаг4
Сесия2
insert into tabl1

И вот можем после этого получить взаимоблокировку.
  
Наверх
 
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #51 - 24. Сентября 2009 :: 12:28
Печать  
Z1 писал(а) 24. Сентября 2009 :: 11:49:
Цитата:
3. Про блокировки - не поняимаю.

Давай примерчик без 1с.Чистый sql.
Смотри есть таблица  в тестовой базе
Код
Выбрать все
CREATE TABLE test_table (
id int  IDENTITY(1,1) ,
int_value  int   NOT NULL ,
CONSTRAINT PK0_test_table  PRIMARY KEY (Id)
)
 


В ней есть одна запись
(1,23)
1.Далее заходим в qa1 переключаемся на тестовую базу
2.Далее заходим в qa2 переключаемся на тестовую базу
3.В qa1 выполняем код
begin tran
update test_table set int_value = int_value + 20 where id =  1
код выполнился  видим зеленую стрелку
4 Переходим в qa2
выполняем код
begin tran
update test_table set int_value = int_value + 40 where id =  1
Код выполняется видим красный квадратик.
Все qa2 остановился на блокировке update индекса
И из этого состояния выйдет только после того как в qa1
либо завершим транзакцию либо от нее откажемся.
Сразу же после этого в qa2 увидим зеленую стрелочку.
Вот это и есть суть блокировки.


Ты приводиш пример того чего я хочу как раз избежать. Тоисть это та конструкция которая не позволяет паралелить проведение.

Ну нет же никаких "update". Злой Для чего мы добавили ROW_ID в RG? Что бы инсетить и избежать необходимости "update". Да, наша задача как раз избежать узкого места в лице "update".

В он лайн режиме нет никакого "update" в RG, да он есть при сворачивании, но сворачивание делаеться не в он лайн, а если на то пошло ночью, монопольно. Какие тут блокировки, нафиг нам тут паралелизм?
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #52 - 24. Сентября 2009 :: 12:29
Печать  
chicago писал(а) 24. Сентября 2009 :: 12:22:
Z1 писал(а) 24. Сентября 2009 :: 11:36:
Цитата:
2. На счет "грязного чтения", да возможно, но стандартная процедура также с (NOLOCK).

ну тут ты тоже не совсем прав
в той же приведенной выше _1sp_RG99_Select
нет никаких хинтов.
Когда выполняешь стандартный запрос из модуля проведения
Запрос = СоздатьОбъект("Запрос"); тоже нет хинтов.


1. В "_1sp_RG99_Select" - нет хинта.
2. В "Запрос = СоздатьОбъект("Запрос")" - есть хинт (у меня есть).

Будем дальше спорить? Представь текст запроса который уходит на сервер при
Код
Выбрать все
Запрос.Выполнить(ТекЗап) 


.

Я вообще не спорю.
  
Наверх
 
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #53 - 24. Сентября 2009 :: 12:34
Печать  
Z1 писал(а) 24. Сентября 2009 :: 12:27:
chicago писал(а) 24. Сентября 2009 :: 12:14:
Z1 писал(а) 24. Сентября 2009 :: 11:33:
Цитата:
1. Ну нет же никаких "доп таблиц" в реализации блокировк опер. учета (доп. таблицы в бух. учете). В даном контексте есть лишь модифиц. таблица RG.

Для возникнования блокировки и даже взаимоблокиовки достаточно и одной таблицы


Ок. Пример? Когда при инсете в табл. с индексом в котором есть поле с инкрементом может возникнуть взаимоблок.? Да есть время перстройки индекса, но этого не избежать, и это весьма маловероятно.

Если все делают insert только в одну таблицу
взаимоблокировки не будет.
Если таблицы две то наверное может
Очень сильно зависит от уровня изоляции
Шаг1
Сесия1
begin tran
insert into tabl1

Шаг2
Сесия2
begin tran
insert into tabl2

Шаг3
Сесия1
insert into tabl2

Шаг4
Сесия2
insert into tabl1

И вот можем после этого получить взаимоблокировку.


Все последний раз отвечаю таблица RG одна. Взаимоблокировки возможны, но во время перестройки индекса. Давай смоделируем ситуацию когда такое может возникнуть:
- если все ок - маловероятно;
- возможно если в сервака выдернуть все ядра и оставить одно;
- возможно при падении (физической деградаци) рейд масива;
- еще?
Но это уже не штатные ситуации это есть исключения.
Давай с этим закончим, принято:
- таблица RG одна;
- в он лайн - только INSET;
- в офф лайн (читай монопольно) - UPDATE.
Будут блокировки?. Вопросы есть?
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #54 - 24. Сентября 2009 :: 12:35
Печать  
chicago писал(а) 24. Сентября 2009 :: 12:28:
Z1 писал(а) 24. Сентября 2009 :: 11:49:
Цитата:
3. Про блокировки - не поняимаю.

Давай примерчик без 1с.Чистый sql.
Смотри есть таблица  в тестовой базе
Код
Выбрать все
CREATE TABLE test_table (
id int  IDENTITY(1,1) ,
int_value  int   NOT NULL ,
CONSTRAINT PK0_test_table  PRIMARY KEY (Id)
)
 


В ней есть одна запись
(1,23)
1.Далее заходим в qa1 переключаемся на тестовую базу
2.Далее заходим в qa2 переключаемся на тестовую базу
3.В qa1 выполняем код
begin tran
update test_table set int_value = int_value + 20 where id =  1
код выполнился  видим зеленую стрелку
4 Переходим в qa2
выполняем код
begin tran
update test_table set int_value = int_value + 40 where id =  1
Код выполняется видим красный квадратик.
Все qa2 остановился на блокировке update индекса
И из этого состояния выйдет только после того как в qa1
либо завершим транзакцию либо от нее откажемся.
Сразу же после этого в qa2 увидим зеленую стрелочку.
Вот это и есть суть блокировки.


Ты приводиш пример того чего я хочу как раз избежать. Тоисть это та конструкция которая не позволяет паралелить проведение.

Ну нет же никаких "update". Злой Для чего мы добавили ROW_ID в RG? Что бы инсетить и избежать необходимости "update". Да, наша задача как раз избежать узкого места в лице "update".

В он лайн режиме нет никакого "update" в RG, да он есть при сворачивании, но сворачивание делаеться не в он лайн, а если на то пошло ночью, монопольно. Какие тут блокировки, нафиг нам тут паралелизм?

ну тогда ты должен понять что есть блокировка.
Что блокировки это не всегда плохо. Что в многопользовательской системе блокировок тебе избежать ну никак не удасться.
Сам MS sql основан на блокировках. Даже из этой ветки за кажущейся простотой видна глубина проблем многопользовательской работы с таблицами.
( Аналогия из жизни представь что в Москве перестали работать все светофоры а такое было 25 мая когда была крупная авария.
прикольно ездить без светофоров и когда все уже опаздывают.
Очень грубо можно рассматривать блокировки как светофоры )
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #55 - 24. Сентября 2009 :: 12:41
Печать  
chicago писал(а) 24. Сентября 2009 :: 12:34:
Z1 писал(а) 24. Сентября 2009 :: 12:27:
chicago писал(а) 24. Сентября 2009 :: 12:14:
Z1 писал(а) 24. Сентября 2009 :: 11:33:
Цитата:
1. Ну нет же никаких "доп таблиц" в реализации блокировк опер. учета (доп. таблицы в бух. учете). В даном контексте есть лишь модифиц. таблица RG.

Для возникнования блокировки и даже взаимоблокиовки достаточно и одной таблицы


Ок. Пример? Когда при инсете в табл. с индексом в котором есть поле с инкрементом может возникнуть взаимоблок.? Да есть время перстройки индекса, но этого не избежать, и это весьма маловероятно.

Если все делают insert только в одну таблицу
взаимоблокировки не будет.
Если таблицы две то наверное может
Очень сильно зависит от уровня изоляции
Шаг1
Сесия1
begin tran
insert into tabl1

Шаг2
Сесия2
begin tran
insert into tabl2

Шаг3
Сесия1
insert into tabl2

Шаг4
Сесия2
insert into tabl1

И вот можем после этого получить взаимоблокировку.


Все последний раз отвечаю таблица RG одна. Взаимоблокировки возможны, но во время перестройки индекса. Давай смоделируем ситуацию когда такое может возникнуть:
- если все ок - маловероятно;
- возможно если в сервака выдернуть все ядра и оставить одно;
- возможно при падении (физической деградаци) рейд масива;
- еще?
Но это уже не штатные ситуации это есть исключения.
Давай с этим закончим, принято:
- таблица RG одна;
- в он лайн - только INSET;
- в офф лайн (читай монопольно) - UPDATE.
Будут блокировки?. Вопросы есть?

а у тебя документ двигает только один регистр ?
Если много строк в документах и есть движения по нескольким регистрам вот тебе и пожалуйста взаимоблокировки возможны даже при одних insertax речь исключительно о движениях регистров.
  
Наверх
 
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #56 - 24. Сентября 2009 :: 12:47
Печать  
Z1 писал(а) 24. Сентября 2009 :: 12:35:
ну тогда ты должен понять что есть блокировка.
Что блокировки это не всегда плохо. Что в многопользовательской системе блокировок тебе избежать ну никак не удасться.
Сам MS sql основан на блокировках. Даже из этой ветки за кажущейся простотой видна глубина проблем многопользовательской работы с таблицами.
( Аналогия из жизни представь что в Москве перестали работать все светофоры а такое было 25 мая когда была крупная авария.
прикольно ездить без светофоров и когда все уже опаздывают.
Очень грубо можно рассматривать блокировки как светофоры )


Конечно, без блокировок никак и я себе даю в этом отчет. Но я за управляемые блокировки, не путать с деделоками или неуправляемые взаимоблокировки.

Когда например будуть возникать такие "управляемые" блокировки? Они точно будуть возникать в моменты когда в одно и тоже время:
- два (и боле) документов "захотят" списать один и тот же товар по одному и тому же складу. Почему? Потому что перед проведением самого первого документа я наложил блокировку на ресур RG с указаными измерениями, а при начале проведени каждого 1+N документа он будет пытатся (безуспешно) наложить "такую же блокировку". Соотвтественно каждий N + 1 "будет" ждать "N-го". И это есть правильно. Ведь нелзя списать товара - Х (минус Икс);
- когда распроводиться документ (П1) который сделал приход товара на склад, который же хочет списать документ (Р1). Да Р1 будет ждать П1;
- другие случаи.

Но эти блокировки есть управляемые.

PS.
Все более чувствую необходимость в тес. конф.
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #57 - 24. Сентября 2009 :: 12:54
Печать  
что за управляемые блокировки. что то ты путаешь.

Начнем с того что сам MS sql полностью декларативный язык.
MS sql сервер без всякого твоего или моего желания может повышать
уровень блокировок от строк к страницам от страниц полностью к таблице.
  
Наверх
 
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #58 - 24. Сентября 2009 :: 12:55
Печать  
Z1 писал(а) 24. Сентября 2009 :: 12:41:
а у тебя документ двигает только один регистр ?
Если много строк в документах и есть движения по нескольким регистрам вот тебе и пожалуйста взаимоблокировки возможны даже при одних insertax речь исключительно о движениях регистров.


Нет конечно, не один. "взаимоблокировки возможны даже при одних insertax" согласен, но это уже совсем другая история. Да возможны. Ты знаеш как их избежать? Я нет.
  
Наверх
ICQ  
IP записан
 
chicago
Senior Member
****
Отсутствует


1C++, I have nothing to
say more!

Сообщений: 316
Местоположение: Тернополь-Киев
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Как обойти блокировку таблиц итогов по регистрам RG####?
Ответ #59 - 24. Сентября 2009 :: 12:57
Печать  
Z1 писал(а) 24. Сентября 2009 :: 12:54:
что за управляемые блокировки. что то ты путаешь.

Начнем с того что сам MS sql полностью декларативный язык.
MS sql сервер без всякого твоего или моего желания может повышать
уровень блокировок от строк к страницам от страниц полностью к таблице.


Давай пока оставим этот дискус. Ок?
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 2 3 [4] 
ОтправитьПечать