Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Блокировка таблиц драйвером FoxPro (число прочтений - 14005 )
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Блокировка таблиц драйвером FoxPro
12. Марта 2008 :: 10:11
Печать  
Как известно uzhast исправил дравйвер http://uzhast.fatal.ru/vfpoledb/

Цитата:
В драйвере отключены блокировки таблиц 1С при выполнении прямого запроса. Это решает две проблемы:

  1. Позволяет формировать отчеты с прямыми запросами во время проведения документов по тем регистрам, по которым выполняется прямой запрос. В исходном драйвере возникала ошибка: драйвер не мог заблокировать таблицу 1С из-за проведения документа.
  2. Исключает возможность возникновения ситуации, когда при выполнении прямого запроса драйвер заблокирует таблицу регистра 1С, а другой пользователь в это время захочет провести документ по этому регистру. В этом случае 1С не сможет получить доступ к таблице регистра.


Нисколько не умаляя заслуг uzhast тем не менее должен заметить, что существует более изящное  решение проблемы

Команда
Цитата:
SET EXCLUSIVE ON | OFF
ON
Данный параметр ограничивает полный доступ к данным, размещенным в открываемых таблицах. Эти таблицы становятся недоступными для других пользователей в сети.
OFF
В данном режиме открываются все таблицы для коллективного использования , в локальной сети.


Таким образом после создания соединения достаточно выполнить команды
Код
Выбрать все
ОлеДБКоманда = глОлеДБ.СоздатьКоманду();
ОлеДБКоманда.Выполнить("EXECSCRIPT('SET EXCLUSIVE  OFF')");   



аналогично, если например нужно включить режим для вставки или модернизации данных
Код
Выбрать все
ОлеДБКоманда = глОлеДБ.СоздатьКоманду();
ОлеДБКоманда.Выполнить("EXECSCRIPT('SET EXCLUSIVE  ON')");   



Таким образом можно всегда пользоваться родным и наиболее свежим драйвером
и более тонко подходить к вопросу блокирования таблиц.
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #1 - 12. Марта 2008 :: 10:17
Печать  
А если подумать?
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Блокировка таблиц драйвером FoxPro
Ответ #2 - 12. Марта 2008 :: 10:20
Печать  
Nick писал(а) 12. Марта 2008 :: 10:17:
А если подумать?


Поясни
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #3 - 12. Марта 2008 :: 10:23
Печать  
Изящно, говоришь...  Улыбка Твои скрипты ни одной из указанных мной проблем не решают. Что-то не в ту степь тебя понесло Улыбка
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #4 - 12. Марта 2008 :: 10:24
Печать  
kiruha писал(а) 12. Марта 2008 :: 10:20:
Nick писал(а) 12. Марта 2008 :: 10:17:
А если подумать?


Поясни


То что ты раскопал ни как не влияет на блокировки связанные с записью данных. Это параметр эквивалентен открытию 1с в монопольном режиме. Т.е. таблица полностью блокируется одним пользователем, и пока он её не закроет фиг кто ещё к ней обратится
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Блокировка таблиц драйвером FoxPro
Ответ #5 - 12. Марта 2008 :: 10:27
Печать  
Uzhast писал(а) 12. Марта 2008 :: 10:23:
Изящно, говоришь...  Улыбка Твои скрипты ни одной из указанных мной проблем не решают. Что-то не в ту степь тебя понесло Улыбка


Были произведены 2 теста.
Проведение документа с (родным драйвер) регистр Резервы , при включенной настройке
произошла ошибка доступа. При OFF данная ошибка исчезла.

Был эмулирован многопользовательский доступ - также никаких задержек не наблюдалось.

Честно говоря именно об этом и написано в родной документации.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Блокировка таблиц драйвером FoxPro
Ответ #6 - 12. Марта 2008 :: 10:31
Печать  
Nick писал(а) 12. Марта 2008 :: 10:24:
kiruha писал(а) 12. Марта 2008 :: 10:20:
Nick писал(а) 12. Марта 2008 :: 10:17:
А если подумать?


Поясни


То что ты раскопал ни как не влияет на блокировки связанные с записью данных. Это параметр эквивалентен открытию 1с в монопольном режиме. Т.е. таблица полностью блокируется одним пользователем, и пока он её не закроет фиг кто ещё к ней обратится


И что? (не буду придираться к "эквивалентен" -все таки это не так - но будем считать что аналогичен).
Именно это я и писал.

Да возьмите и проверьте.
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #7 - 12. Марта 2008 :: 10:34
Печать  
kiruha писал(а) 12. Марта 2008 :: 10:27:
Uzhast писал(а) 12. Марта 2008 :: 10:23:
Изящно, говоришь...  Улыбка Твои скрипты ни одной из указанных мной проблем не решают. Что-то не в ту степь тебя понесло Улыбка


Были произведены 2 теста.
Проведение документа с (родным драйвер) регистр Резервы , при включенной настройке
произошла ошибка доступа. При OFF данная ошибка исчезла.

Был эмулирован многопользовательский доступ - также никаких задержек не наблюдалось.

Честно говоря именно об этом и написано в родной документации.


При включении этой настройки ты вообще таблицу двумя пользователями не откроешь! Естествено у тебя ошибка доступа
  
Наверх
ICQ  
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #8 - 12. Марта 2008 :: 10:44
Печать  
vfpoledb SP2: не подтверждается. В модуле проведения после выполнения движений вставляю Предупреждение.
Далее во втором экземпляре 1С выполняю запрос с предварительным SET EXCLUSIVE OFF. Результат:
Цитата:
File is in use by another user.

Таким образом, SET EXCLUSIVE не влияет на успешность чтения драйвером Фокспро заблокированной таблицы.

Может, конечно, драйвер не самый новый.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Блокировка таблиц драйвером FoxPro
Ответ #9 - 12. Марта 2008 :: 10:46
Печать  
Nick писал(а) 12. Марта 2008 :: 10:34:
kiruha писал(а) 12. Марта 2008 :: 10:27:
Uzhast писал(а) 12. Марта 2008 :: 10:23:
Изящно, говоришь...  Улыбка Твои скрипты ни одной из указанных мной проблем не решают. Что-то не в ту степь тебя понесло Улыбка


Были произведены 2 теста.
Проведение документа с (родным драйвер) регистр Резервы , при включенной настройке
произошла ошибка доступа. При OFF данная ошибка исчезла.

Был эмулирован многопользовательский доступ - также никаких задержек не наблюдалось.

Честно говоря именно об этом и написано в родной документации.


При включении этой настройки ты вообще таблицу двумя пользователями не откроешь! Естествено у тебя ошибка доступа


Да конечно. Только эта настройка действует по умолчанию.
Т.е. ошибка вызывалась когда НИКАКИХ скриптов не выполнялось.
Uzhast поэтому и вырезал блокировки.
А можно не вырезать а вызвать ОлеДБКоманда.Выполнить("EXECSCRIPT('SET EXCLUSIVE  OFF')");

Nick, ты говоришь правильные вещи - но не понял чему они противоречат.
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #10 - 12. Марта 2008 :: 10:51
Печать  
Я вообще то думаю что Uzhast боролся с другими блокировками или нет?
  
Наверх
ICQ  
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #11 - 12. Марта 2008 :: 10:54
Печать  
ещё можно просто открывать предварительно табличку в разделенном режиме
Use <TableName > in 0 [EXCLUSIVE] [SHARED] [NOUPDATE]
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Блокировка таблиц драйвером FoxPro
Ответ #12 - 12. Марта 2008 :: 11:08
Печать  
Uzhast писал(а) 12. Марта 2008 :: 10:44:
vfpoledb SP2: не подтверждается. В модуле проведения после выполнения движений вставляю Предупреждение.
Далее во втором экземпляре 1С выполняю запрос с предварительным SET EXCLUSIVE OFF. Результат:
Цитата:
File is in use by another user.

Таким образом, SET EXCLUSIVE не влияет на успешность чтения драйвером Фокспро заблокированной таблицы.

Может, конечно, драйвер не самый новый.


драйвер последний http://www.microsoft.com/downloads/details.aspx?FamilyId=E1A87D8F-2D58-491F-A0FA...

Провел много тестов. По методике Uzhast в том числе. Все ОК.
Вероятно ты делаешь"SET EXCLUSIVE  OFF" для разных  ОлеДБ - при этом настройка действует
только в рамках ОлеДБ .
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #13 - 12. Марта 2008 :: 11:14
Печать  
Скачал по этой ссылке. Версия 9.0.0.5815. Результат не изменился.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #14 - 12. Марта 2008 :: 11:30
Печать  
В общем, так. Хватит вешать людЯм лапшу на уши. Улыбка Запутал ты меня. EXCLUSIVE может быть только в двух положениях ON и OFF. Если БЫ он был в ON изначально, то запросы вообще бы нельзя было бы выполнять к текущей базе - файлы открыты 1С. Значит, этот переключатель УЖЕ в OFF. Поэтому твой скрипт ВООБЩЕ ни на что не влияет.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Блокировка таблиц драйвером FoxPro
Ответ #15 - 12. Марта 2008 :: 11:32
Печать  
Uzhast писал(а) 12. Марта 2008 :: 11:14:
Скачал по этой ссылке. Версия 9.0.0.5815. Результат не изменился.


Огромное СПАСИБО!

Выявил важную особенность.
Скрипт должен быть выполнен до проведения второго пользователя - оптимально при начале работы системы.
Если он выполняется только во время проведения второго пользователя - Цитата:
CommandText::Execute(): File is in use by another user.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #16 - 12. Марта 2008 :: 11:39
Печать  
kiruha писал(а) 12. Марта 2008 :: 11:32:
Скрипт должен быть выполнен до проведения второго пользователя - оптимально при начале работы системы.

Сдается мне, что это эффект из-за того, что таблица не закрывается фоксом после выполнения запроса. Но ведь он же тогда кеширование некое производит - я уже натыкался на это. Поэтому, если пользоваться такой вещью, то, ИМХО, возможны проблемы. Нет уж, я таким рецептом пользоваться не рискну.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #17 - 12. Марта 2008 :: 11:51
Печать  
Что и требовалось доказать.

В первом сеансе запускаем SET EXCLUSIVE ON выполняем запрос к остаткам товаров. Запускаем второй сеанс и запускаем накладную на проведение с выдачей предупреждения.
В первом сеансе опять выполняем запрос к остаткам товаров - нормально.

Чуть-чуть меняем набор действий.
В первом сеансе запускаем SET EXCLUSIVE ON выполняем запрос к остаткам товаров.
СРАЗУ ПОСЛЕ ЭТОГО выполняем CLOSE TABLES ALL
Запускаем второй сеанс и запускаем накладную на проведение с выдачей предупреждения.
В первом сеансе опять выполняем запрос к остаткам товаров - получаем облом.

Значит, твой SET EXCLUSIVE основывается не на SET EXCLUSIVE, а на незакрытых файлах базы. Неее, мне такая фенечка с возможностью выдачи устаревших закешированных данных совсем не нужна Улыбка
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #18 - 12. Марта 2008 :: 11:55
Печать  
Тьфу, блин. Выше "SET EXCLUSIVE ON" читать как "SET EXCLUSIVE OFF"
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #19 - 12. Марта 2008 :: 12:00
Печать  
Ну и до кучи: в наборе действий выше убираем SET EXCLUSIVE вообще. Если не делать CLOSE TABLES, то запрос во время проведения документа в другом экземпляре сделать можно. Если добавить CLOSE TABLES, то будет опять облом. Наличие SET EXCLUSIVE вообще ни на что не влияет.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Блокировка таблиц драйвером FoxPro
Ответ #20 - 12. Марта 2008 :: 12:37
Печать  
Предварительно прав Uzhast - дело в кэше.

Только кэшируются не данные, а структура открытых таблиц.
Если в сессии была открыта хотя бы одна запись таблицы(до блокировки другим пользователем) - после этого
без проблем можно открывать любые записи этой таблицы во время проведения другого пользователя...
Т.е. блокировка распостраняется только на чтение структуры
« Последняя редакция: 12. Марта 2008 :: 15:47 - kiruha »  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #21 - 12. Марта 2008 :: 16:19
Печать  
Nick писал(а) 12. Марта 2008 :: 10:17:
А если подумать?

Ну вот, если подумать получается несколько иная картина Подмигивание
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Блокировка таблиц драйвером FoxPro
Ответ #22 - 13. Марта 2008 :: 03:35
Печать  
Nick писал(а) 12. Марта 2008 :: 16:19:
Nick писал(а) 12. Марта 2008 :: 10:17:
А если подумать?

Ну вот, если подумать получается несколько иная картина Подмигивание


Да нет - все верно. SET EXCLUSIVE OFF делает возможным многопользовательский режим
работы - Фокспро не блокирует при запросах других пользователей.
Кстати эта опция как правило устанавливается во время соединения по умолчанию.

Но есть еще 2 проблема - выполнения запросов во время проведения документов 1С.
Дело в том, что эта опция естественно не распостраняется на не ФоксПро системы.
К счастью 1С блокирует только чтение структуры файла.
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #23 - 13. Марта 2008 :: 03:37
Печать  
Цитата:
Но есть еще 2 проблема - выполнения запросов во время проведения документов 1С.
Дело в том, что эта опция естественно не распостраняется на не ФоксПро системы.
К счастью 1С блокирует только чтение структуры файла.

т.е. патч Uzhast решает именно эту проблему?
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Блокировка таблиц драйвером FoxPro
Ответ #24 - 13. Марта 2008 :: 03:42
Печать  
Для того чтобы сделать возможным использование запросов ФоксПро во время проведения
определяем глобальную пременную глОлеДБ.
В процедуре ПриНачалеРаботыСистемы() Вызываем ИнициализацияТаблицФокспро()
- аналог открытия файлов 1С во время входа в программу
Код
Выбрать все
Процедура ИнициализацияТаблицФокспро()
	глОлеДБ = СоздатьОбъект("OLEDBData");
	Рез=глОлеДБ.Соединение("
	|Provider=VFPOLEDB.1;
	//	|Deleted=Yes;
	|Null = Yes;
	|Exclusive = No;
	|SourceType = DBF;
	|Data Source=" + КаталогИБ() + ";
	|Mode=ReadWrite;
	|Extended Properties="""";
	|User ID="""";
	|Password="""";
	|Mask Password=False;
	|Collating Sequence=MACHINE;
	|DSN=""""");
	//  Так как стоит Exclusive = No скрипт  SET EXCLUSIVE OFF не нужен
	локОлеДБКоманда = глОлеДБ.СоздатьКоманду();
	локОлеДБКоманда.Выполнить("EXECSCRIPT('SET ANSI OFF')");
	// Устанавливаем время ожидания захвата таблиц , если во время выполнения запроса кто то проводит документы
	// Очень полезная функция - аналогична времени ожидания в 1С
	локОлеДБКоманда.Выполнить("EXECSCRIPT('SET REPROCESS TO 60 SECONDS')");
// Убираем буфепизацию, чтобы данные возвращаемые запросам всегда были актуальны
	 локОлеДБКоманда.Выполнить("EXECSCRIPT('SET REFRESH TO 0,-1')");
	ВремяНачалоЗапроса=_GetPerformanceCounter();
	// Откроем таблицы Регистра итогов. Для минимального времени используем основной индекс
	Для ИИ=1 По Метаданные.Регистр() Цикл
		МетаданныеРегистр=Метаданные.Регистр(ИИ);
		ИдентификаторРегистра=МетаданныеРегистр.Идентификатор;
		СтрокаПеременныхПоля=" DTOS(РегОстатков.period) ";
		Для ЛЛ=1 По МетаданныеРегистр.Измерение() Цикл
			ИзмерениеРегистра=МетаданныеРегистр.Измерение(ЛЛ);
			д,ИзмерениеРегистра.Длина,ИзмерениеРегистра.Точность,"РегОстатков");
		КонецЦикла;
		текстЗапроса="
		| SELECT
		|
		|РегОстатков.period
		|
		|FROM $РегистрИтоги."+ИдентификаторРегистра+" as РегОстатков
		|WHERE "+СтрокаПеременныхПоля+"='12345678'
		|";
		локОлеДБКоманда.Выполнить(текстЗапроса);
		текстЗапроса="
		| SELECT
		|
		|РегОстатков.iddoc
		|
		|FROM $Регистр."+ИдентификаторРегистра+" as РегОстатков
		|WHERE
		|";
		локОлеДБКоманда.Выполнить(текстЗапроса);


	КонецЦикла;
	//Таблица констант
	текстЗапроса="
	| SELECT
	|
	|Константа.docid
	|
	|FROM 1SCONST as Константа
	|WHERE Константа.docid+STR(Константа.actno,6)+STR(Константа.partno,3)='123456789'
	|";
	локОлеДБКоманда.Выполнить(текстЗапроса);
	// Таблица подчиненных
	текстЗапроса="
	| SELECT
	|
	|Подчиненные.childid
	|
	|FROM 1SCRDOC as Подчиненные
	|WHERE Подчиненные.childid+Подчиненные.mdid+Подчиненные.parentval='123456789'
	|";
	локОлеДБКоманда.Выполнить(текстЗапроса);

	текстЗапроса="
	| SELECT
	|
	|Жур.iddoc
	|
	|FROM  1SJOURN  as жур
	|WHERE Жур.iddoc='123456789'
	|";
	локОлеДБКоманда.Выполнить(текстЗапроса);
/// Здесь можно открыть еще таблицы бухгалтерии - если кому нужно

	ВремяКонецЗапроса=_GetPerformanceCounter();
	ВремяЗапроса=ВремяКонецЗапроса-ВремяНачалоЗапроса;
	локОлеДБКоманда.Выполнить("EXECSCRIPT('SET REPROCESS TO 0 SECONDS')");
	//Сообщить("Запрос длился "+(ВремяЗапроса/1000)+"с");

КонецПроцедуры 


где
Код
Выбрать все
Функция Таблицы)
	5884+sp5885+sp5886
	ИмяПоляНач="$"+ПсевдонимТаблицы+"."+ИмяПоля;
	Если Тип="Справочник" Тогда
		ПеременнаяПоля=ИмяПоляНач;
	ИначеЕсли  Тип="Документ"  Тогда
	   ПеременнаяПоля=ИмяПоляНач;
	ИначеЕсли  Тип="Перечисление"  Тогда
	   ПеременнаяПоля=ИмяПоляНач;
	ИначеЕсли  Тип="Строка"  Тогда
	   ПеременнаяПоля=ИмяПоляНач;
	ИначеЕсли  Тип="Неопределенный"  Тогда
	   ПеременнаяПоля=ИмяПоляНач;
	ИначеЕсли  Тип="Дата"  Тогда
	   ПеременнаяПоля="DTOS("+ИмяПоляНач+")";
	ИначеЕсли  Тип="Число"  Тогда
	   ПеременнаяПоля="STR("+ИмяПоляНач+","+Строка(Длина+1)+","+Строка(Точность)+")";

	КонецЕсли;
	Возврат ПеременнаяПоля;
КонецФункции    



Инициализация занимает 0.05 сек
Все. Можно пользоваться любыми запросами созданными на основании глОлеДБ
« Последняя редакция: 13. Марта 2008 :: 22:29 - kiruha »  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #25 - 13. Марта 2008 :: 03:44
Печать  
Цитата:
Да нет - все верно. SET EXCLUSIVE OFF делает возможным многопользовательский режим

Вообще говоря этой опции сто лет в обед, я думал что все о ней знают. Не знаю как в более ранних версиях но в VFP 5 она уже была. Правда тогда ещё провайдера небыло Улыбка

Вот на всякий случай перечень настроек среды, правда это относится к самому FoxPro, возможно к провайдеру применимы не все
  

SET.zip ( 25 KB | Загрузки )
Наверх
ICQ  
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #26 - 13. Марта 2008 :: 04:05
Печать  
kiruha писал(а) 13. Марта 2008 :: 03:42:
Для того чтобы сделать возможным использование запросов ФоксПро во время проведения
определяем глобальную пременную глОлеДБ.

Если тебе нравится ставить эксперименты на собственной заднице - ради бога. Никто не запрещает (может, ты удовольствие от ощущений получаешь). Но не надо преподносить ЭТО как решение проблемы блокировок. Потому что из-за тебя кто-то может здорово попасть.

Я считаю, что для каждого логического юнита выборки данных нужно делать передподключение к БД, иначе есть риск получения устаревших данных. Юнитом считаю, например, выборку данных при проведении документа или процедуру формирования отчета.

Я уже писал, как наталкивался на проблему кеширования. Проводим один документ, делаем запрос. В этом же сеансе 1С проводим еще документ. Делаем второй, точно такой же, запрос. Получаем старые данные. Если перед выполнением второго запроса вставить переподключение - все работает. Повторяемость 100%. Однако, когда пытался выделить минимальный код, демонстрирующий проблему, то не получилось. Тем не менее, считаю, что проблема кеширования есть - просто достаточно редко проявляется.

В общем, кто как хочет. Я предупредил - чур, в случае проблем с задницей - претензии мне не предъявлять Улыбка Впрочем, вы знаете КОМУ их нужно будет предъявлять в случае использования предложенного здесь решения Улыбка
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #27 - 13. Марта 2008 :: 04:17
Печать  
Uzhast писал(а) 13. Марта 2008 :: 04:05:
kiruha писал(а) 13. Марта 2008 :: 03:42:
Для того чтобы сделать возможным использование запросов ФоксПро во время проведения
определяем глобальную пременную глОлеДБ.

Если тебе нравится ставить эксперименты на собственной заднице - ради бога. Никто не запрещает (может, ты удовольствие от ощущений получаешь). Но не надо преподносить ЭТО как решение проблемы блокировок. Потому что из-за тебя кто-то может здорово попасть.

Я считаю, что для каждого логического юнита выборки данных нужно делать передподключение к БД, иначе есть риск получения устаревших данных. Юнитом считаю, например, выборку данных при проведении документа или процедуру формирования отчета.

Я уже писал, как наталкивался на проблему кеширования. Проводим один документ, делаем запрос. В этом же сеансе 1С проводим еще документ. Делаем второй, точно такой же, запрос. Получаем старые данные. Если перед выполнением второго запроса вставить переподключение - все работает. Повторяемость 100%. Однако, когда пытался выделить минимальный код, демонстрирующий проблему, то не получилось. Тем не менее, считаю, что проблема кеширования есть - просто достаточно редко проявляется.

В общем, кто как хочет. Я предупредил - чур, в случае проблем с задницей - претензии мне не предъявлять Улыбка Впрочем, вы знаете КОМУ их нужно будет предъявлять в случае использования предложенного здесь решения Улыбка


Я сомневаюсь что и твой вариант полностью решает проблему получения достоверных данных. Хотя он безусловно уменьшает такую вероятность
  
Наверх
ICQ  
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #28 - 13. Марта 2008 :: 04:20
Печать  
Nick писал(а) 13. Марта 2008 :: 04:17:
Я сомневаюсь что и твой вариант полностью решает проблему получения достоверных данных. Хотя он безусловно уменьшает такую вероятность

Совершенно согласен. Мой вариант - тоже фигня Улыбка ИМХО, немного менее страшная, но тем не менее Улыбка В общем, на СКЛ переходить надо, ничего не попишешь.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Блокировка таблиц драйвером FoxPro
Ответ #29 - 13. Марта 2008 :: 04:35
Печать  
Uzhast писал(а) 13. Марта 2008 :: 04:05:
kiruha писал(а) 13. Марта 2008 :: 03:42:
Для того чтобы сделать возможным использование запросов ФоксПро во время проведения
определяем глобальную пременную глОлеДБ.

Если тебе нравится ставить эксперименты на собственной заднице - ради бога. Никто не запрещает (может, ты удовольствие от ощущений получаешь). Но не надо преподносить ЭТО как решение проблемы блокировок. Потому что из-за тебя кто-то может здорово попасть.


Где ты увидел хоть одну нестандартную команду в процедуре инициализации? Ужас
Там проводится серия совершенно стандартных запросов.

P.S> Считать использование родного драйвера вместо пропатченного экспирементом
над собственной задницей - это сильно Улыбка
Все команды входят в официальную документацию.
P.S> Естественно я включу функционал в свою базу.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #30 - 13. Марта 2008 :: 04:37
Печать  
kiruha писал(а) 13. Марта 2008 :: 04:35:
Где ты увидел хоть одну нестандартную команду в процедуре инициализации? Ужас
Там проводится серия совершенно стандартных запросов.

Чукча писатель? Я совершенно ясно сказал, что я считаю некорректным.
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #31 - 13. Марта 2008 :: 04:38
Печать  
Цитата:
P.S> Естественно я включу функционал в свою базу.

Удачи!
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Блокировка таблиц драйвером FoxPro
Ответ #32 - 13. Марта 2008 :: 05:17
Печать  
Uzhast писал(а) 13. Марта 2008 :: 04:37:
kiruha писал(а) 13. Марта 2008 :: 04:35:
Где ты увидел хоть одну нестандартную команду в процедуре инициализации? Ужас
Там проводится серия совершенно стандартных запросов.

Чукча писатель? Я совершенно ясно сказал, что я считаю некорректным.


глобальную переменную глОЛЕДБ использую год. Проблем не наблюдалось.
И вероятно не я один.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #33 - 13. Марта 2008 :: 05:52
Печать  
kiruha писал(а) 13. Марта 2008 :: 05:17:
глобальную переменную глОЛЕДБ использую год. Проблем не наблюдалось.
И вероятно не я один.

Я надеюсь, ты понимаешь, что годы положительного опыта - ничто по сравнению даже с одним отрицательный случаем. Но, естественно, тебе никто не может запретить заткнуть уши и со словами "ня-ня-ня, я тебя не слышу" игнорировать отрицательный опыт. Особенно в случае, когда он исходит от такой нехорошей падлы, как я  Смех
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Блокировка таблиц драйвером FoxPro
Ответ #34 - 13. Марта 2008 :: 07:46
Печать  
Uzhast писал(а) 13. Марта 2008 :: 05:52:
kiruha писал(а) 13. Марта 2008 :: 05:17:
глобальную переменную глОЛЕДБ использую год. Проблем не наблюдалось.
И вероятно не я один.

Я надеюсь, ты понимаешь, что годы положительного опыта - ничто по сравнению даже с одним отрицательный случаем. Но, естественно, тебе никто не может запретить заткнуть уши и со словами "ня-ня-ня, я тебя не слышу" игнорировать отрицательный опыт. Особенно в случае, когда он исходит от такой нехорошей падлы, как я  Смех


1.Наверно не менее 100 000 пользователей в мире каждый день работают с FoxPro и не подозревают -
что оказывается для того чтобы данные были не кривые - им нужно все время прерывать соединение с базой,
а чтобы работал многопользовательский режим - нужно пропатчить драйвер.

2. Где то на форуме (itland?) встречалось упоминание о проблеме с "грязными" данными. Не смог сейчас найти.
Там была рекомендация закрывать команду.
У меня везде после запроса Цитата:
ОлеДБКоманда.Закрыть();
Проблем нет.

3.Uzhast, я хоть где то написал, что ты - нехороший человек? Улыбка
И за любое замечание я только благодарен Улыбка.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Блокировка таблиц драйвером FoxPro
Ответ #35 - 13. Марта 2008 :: 12:13
Печать  
На всякий случай, если беспокоишься за "грязное" чтение - можно явно выполнить при инициализации
Код
Выбрать все
локОлеДБКоманда.Выполнить("EXECSCRIPT('SET SQLBUFFERING  OFF')"); 


Цитата:
ON
Определяет, что оператор SQL - SELECT, при выполнении запроса, использует локальный буфер данных, если таковой используется; если источник данных не использует буфферизацию, то данные выбираются с диска.

OFF
(по-умолчанию) Определяет, что оператор SQL - SELECT выбирает данные с диска, где расположен источник данных.

Но вообще она должна действовать по умолчанию.
  
Наверх
 
IP записан
 
nicolas
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Зарегистрирован: 24. Мая 2006
Re: Блокировка таблиц драйвером FoxPro
Ответ #36 - 13. Марта 2008 :: 12:19
Печать  
kiruha писал(а) 13. Марта 2008 :: 03:42:
Для того чтобы сделать возможным      локОлеДБКоманда.Выполнить("EXECSCRIPT('SET REPROCESS TO 60 SECONDS')");


А вот с этой штукой я бы аккуратнее бы обращался...
Попытаетесь вы, что то писать, запись заблокирована, что будет, будем стучаться в эту запись 60 сек. А дальше пользователь, который захватил эту запись, ее освобождает, и Вы туда преспокойно пишите свои данные. А Если он там свои записал? Что будет? В свое время на FOX-е попал на эту бяку. В системе не удалял физически удаленные записи, использовал их повторно. Вот и получилось: Первый пользователь захватил, записал, снял блокировку. А второй в момент захвата записи первым, тоже пришел к этой записи,  и ждал когда ее освободят. Результат был плачевный...
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #37 - 13. Марта 2008 :: 12:21
Печать  
Объясни мне, пожалуйста, результаты вот этого теста - см. приложенный файл - обработка "Тест", встроенная в конфигурацию.
  

TotalEmpty.rar ( 7 KB | Загрузки )
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Блокировка таблиц драйвером FoxPro
Ответ #38 - 13. Марта 2008 :: 12:31
Печать  
nicolas писал(а) 13. Марта 2008 :: 12:19:
kiruha писал(а) 13. Марта 2008 :: 03:42:
Для того чтобы сделать возможным      локОлеДБКоманда.Выполнить("EXECSCRIPT('SET REPROCESS TO 60 SECONDS')");


А вот с этой штукой я бы аккуратнее бы обращался...
Попытаетесь вы, что то писать, запись заблокирована, что будет, будем стучаться в эту запись 60 сек. А дальше пользователь, который захватил эту запись, ее освобождает, и Вы туда преспокойно пишите свои данные. А Если он там свои записал? Что будет? В свое время на FOX-е попал на эту бяку. В системе не удалял физически удаленные записи, использовал их повторно. Вот и получилось: Первый пользователь захватил, записал, снял блокировку. А второй в момент захвата записи первым, тоже пришел к этой записи,  и ждал когда ее освободят. Результат был плачевный...


Потому что, что-то с блокировками было  не то, но вообщем эта тема не имеет значения -
в процедуре не используется никакой записи, лично я вообще не использую записи через FoxPro в реальном
времени, и в конце процедуры стоит сброс этого параметра на 20 сек - можете выставить 0,
от этого ничего не изменится.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Блокировка таблиц драйвером FoxPro
Ответ #39 - 13. Марта 2008 :: 13:48
Печать  
Uzhast писал(а) 13. Марта 2008 :: 12:21:
Объясни мне, пожалуйста, результаты вот этого теста - см. приложенный файл - обработка "Тест", встроенная в конфигурацию.


Поменяй пожалуйста
Код
Выбрать все
Запрос.Выполнить("EXECSCRIPT('SET SQLBUFFERING  OFF')"); 


на
Код
Выбрать все
Запрос.Выполнить("EXECSCRIPT('SET REFRESH TO 0,-1')"); 

  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: Блокировка таблиц драйвером FoxPro
Ответ #40 - 13. Марта 2008 :: 14:48
Печать  
kiruha писал(а) 13. Марта 2008 :: 13:48:
Поменяй пожалуйста

Неее, ты мне тест прокомментируй. Ты ж всех тут уверял, что все абсолютно безопасно, про сто тыщ леммингов рассказывал, которые постоянно получают "некривые" данные. SET SQLBUFFERING приплел еще... И вообще жду благодарности за избавление твоей задницы от последствий от вставляния этого твоего кода в твою конфу   Смех
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Блокировка таблиц драйвером FoxPro
Ответ #41 - 13. Марта 2008 :: 22:11
Печать  
Uzhast писал(а) 13. Марта 2008 :: 14:48:
kiruha писал(а) 13. Марта 2008 :: 13:48:
Поменяй пожалуйста

Неее, ты мне тест прокомментируй. Ты ж всех тут уверял, что все абсолютно безопасно, про сто тыщ леммингов рассказывал, которые постоянно получают "некривые" данные. SET SQLBUFFERING приплел еще... И вообще жду благодарности за избавление твоей задницы от последствий от вставляния этого твоего кода в твою конфу   Смех


А что тут комментировать?
Буфер в 0 выполняет не команда SET SQLBUFFERING а Цитата:
SET REFRESH TO 0,-1

В твоем специальном тесте если между одинаковыми запросами меньше 3 сек и в этот промежуток времени успели поменять запись то запрос возвращает те же данные. Надо сказать ситуация крайне маловероятная и для отчетов несущественная.
Даже эту малую вероятность легко исключить командой
Код
Выбрать все
Запрос.Выполнить("EXECSCRIPT('SET REFRESH TO 0,-1')"); 

Выполняя эту команду 100 тыщ лемингов получают вполне корректные данные.
Я не утверждаю, что никогда не ошибаюсь.
Но благодоря таким программерам как Uzhast и Nick можно получить вполне качественный код Улыбка
За что и персональное спасибо от меня Улыбка
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать