Bug 5659

Summary: Ошибка "LOCK TABLE can only be used in transaction blocks" и postgresql 8.4
Product: Postgres@Etersoft Reporter: Александр <tuxmaniacster>
Component: выполнение запросовAssignee: Юрий Филь <yurifil>
Status: CLOSED FIXED QA Contact:
Severity: critical    
Priority: P2 CC: boris, lav
Version: не указана   
Target Milestone: ---   
Hardware: PC   
OS: All   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Attachments: снятие запрета на блокировки таблиц вне транзакций
очистка временых таблиц даже при наличии ссылок
Revert "Disallow LOCK TABLE outside a transaction block (or function), since this case"

Description Александр 2010-06-15 11:00:41 MSD
В postgresql 8.4 есть небольшая особенность по сравнению с 8.3 - теперь блокировки таблиц вне транзакции запрещены и считаются ошибкой пользователя. Комментарий в оригинале предельно ясен: Disallow LOCK TABLE outside a transaction block (or function), since this case almost certainly represents user error.
Ссылка на коммит - http://anoncvs.postgresql.org/cvsweb.cgi/pgsql/src/backend/tcop/utility.c.diff?r1=1.299;r2=1.300;f=h
Вся беда в том, что 1С81 до сих пор пытается накладывать блокировки вне транзакций (видимо, чтение списка изменений к postgresql 8.4 сочли не обязательным, а на предупреждение в readme для fasttrun, гласящее "Warning: function isn't transaction safe!" вообще внимания не обратили).
В результате, имеем кучу "глюков" после перехода на postgresql 8.4 с непроводящимися документами (легко воспроизвести в "бухгалтерии предприятия", попытавшись перепровести документы по основным средствам).
Так что рекомендую включить в Ваши сборки postgresql 8.4 дополнительный патч, обратный описанному выше. И держать его до тех пор, пока сами 1С-овцы не поправят поведение своего замечательного продукта :)
Comment 1 Александр 2010-06-15 12:52:20 MSD
Created attachment 1728 [details]
снятие запрета на блокировки таблиц вне транзакций
Comment 2 Александр 2010-06-15 12:53:52 MSD
Created attachment 1729 [details]
очистка временых таблиц даже при наличии ссылок
Comment 3 Александр 2010-06-15 12:58:12 MSD
Выложил 2 патча:
1. Отменяет запрет на блокировку таблиц вне транзакций
2. Разрешает очистку временных таблиц даже при наличии ссылок (1С чистит их через fasttrun)
Comment 4 Boris Savelev 2010-06-20 10:42:14 MSD
Стас, будут комментарии, или можно просто патчи включать?
Comment 5 Станислав Коробейников 2010-06-22 18:17:19 MSD
Второй патч(1729) можно так и приложить. Ничего в нем плохого не вижу, если 1с это не нравится. Только хочется узнать, как воспроизвести ошибку на 1с.

А первый(1728), я сделал бы в виде отката коммита fc5af261e545646848ba8b0ce5b45115a76dc77b (хотя не принципиально). 
Comment 6 Станислав Коробейников 2010-06-22 18:19:28 MSD
Created attachment 1740 [details]
Revert "Disallow LOCK TABLE outside a transaction block (or function), since this case"

Откат коммита ограничевающего использование блокировок вне транзакций.
Comment 7 Александр 2010-06-22 20:52:53 MSD
(In reply to comment #5)
> Только хочется узнать, как
> воспроизвести ошибку на 1с.

У меня такая конфигурация: бухгалтерия предприятия 1.6, платформа 8.1.15, postgresql 8.4.3. Легко и непринужденно воспроизводится на документах по основным средствам. Например, создаем и проводим документ "Списание ОС", затем снова открываем документ и перепроводим его, получаем ошибку "основное средство уже списано документом №.... от ............". Самое смешное - что уже списано этим самым документом. При этом у документа снимается признак проведения, но его старые движения не вычищаются, а так и остаются висеть в таблице проводок. Далее все попытки провести документ бесполезны, ибо выскакивает все та же ошибка "основное средство уже списано документом №.... от ............". Это мы видим со стороны пользователя.
Если же заглянуть в лог postgresql, то видим кучу ошибок о невозможности очистить временные таблицы, видимо 1с от этого паникует и останавливается на пол-пути, сняв признак проведения документа но не очистив движения. Хотя проведение документа должно выполняться в транзакции (BEGIN, удаляем старые движения, записываем новые, COMMIT), но видимо это не совсем так (да да, совсем не так как написано в желтых книжках от 1с :)
В общем, ничего не изменилось с тех пор, как я осенью тестировал версию postgresql 8.4.1 с патчами от 1с, правда тогда еще был статус беты и я особо не заморачивался, ибо считал, что разработчики из 1с все оттестируют и поправят недоделки. Зря я так считал :) Пришлось самому поправить и теперь все работает. Остался только один странный баг - при формировании очень большого отчета (что-нить типа карточки счета на 5000 страниц печатного текста) postgresql 8.4.3 может призадуматься минут на 30-40, тогда как с версией postgresql 8.3.8 на формирование подобного отчета уходило 1-2 минуты.
Comment 8 Юрий Филь 2010-06-25 23:00:07 MSD
Приложил патчи, собрал srpm и запустил на сборку. Версия 8.4.2.
Пока можно протестировать на системах, для которых есть пакет.
Comment 9 Александр 2010-06-26 00:52:07 MSD
(In reply to comment #8)
> Приложил патчи, собрал srpm и запустил на
> сборку. Версия 8.4.2.
> Пока можно протестировать на системах, для
> которых есть пакет.
> 

8.4.2? Так ведь последние патчи к postgresql 8.4.3 уже есть. Правда 1С их почему-то в открытый доступ не выложила. Если у Вас нет доступа к ним, могу здесь выложить.
От себя могу добывить: за последние пару недель активного тестирования postgresql на sles11, opensolaris b134 и mac os 10.6 ошибок пока не наблюдаю
Comment 10 Юрий Филь 2010-06-28 15:42:55 MSD
Собрал 8.4.4 с двумя патчами, о которых шла речь выше.
Если можно, пришлите последние патчи.
Comment 11 Александр 2010-06-28 18:08:07 MSD
(In reply to comment #10)
> Если можно, пришлите последние патчи.

отправил Вам на e-mail
Comment 12 Юрий Филь 2010-06-30 14:46:17 MSD
(In reply to comment #11)
> отправил Вам на e-mail
> 

Спасибо, но от старых они почти не отличаются. Можно качать 8.4.4.
Comment 13 Юрий Филь 2010-07-09 10:59:21 MSD
Закрываю.