Версия: entity 5.4.0.1, OneScript 2.2.0.
Аудит потокобезопасности entity нашел ошибки в самом движке. Все они исправлены PR в
EvilBeaver/OneScript (на 2026-10-02 открыты); до выхода версии с ними entity на 2.2 работает с
оговорками ниже.
| Ошибка движка |
Чем это оборачивается в entity |
PR |
ПриЗавершении вызывает обработчики по живому списку: подписка или отписка во время события дает «Collection was modified», и оставшиеся обработчики не вызываются |
Наблюдатель получает событие из обработчика завершения пула (освобождение, брошенная транзакция) и работает с другим источником данных, которым этот поток еще не пользовался. Пул того источника подписывается на завершение потока прямо во время события. Обработчики, подписанные позже, не вызываются: их пулы не получают назад соединения завершившегося потока (место занято до конца процесса), источники с автозакрытием не закрываются |
#1767 |
Исключение одного обработчика ПриЗавершении отменяет все следующие |
Любой обработчик завершения, подписанный раньше пула (прикладной или ИсточникДанных при сбое закрытия и журнала), падает — и пул не возвращает соединения завершившегося потока |
#1785 |
| Параллельная первая загрузка библиотеки: второе задание принимает ее за циклическую зависимость, грузит повторно или видит модуль неинициализированным |
sql подключается лениво: #Использовать sql есть только в служебном конструкторе коннектора, который компилируется при открытии соединения, вне блокировки пула. Если первые соединения процесса открываются параллельно (например, источник инициализируется лениво в обработчиках запросов), открытие соединения падает |
#1768 |
| Компиляция сценария, пока другой поток впервые загружает библиотеку или подключает компоненту, падает с ложным «Неизвестный символ» |
entity компилирует на горячих путях: конструктор коннектора на каждое новое соединение, декоратор на каждый экземпляр сущности. Если в это время прикладной код в другом потоке впервые подключает библиотеку, операция entity изредка падает |
#1775 |
Регистрация типов во время работы (ПодключитьСценарий, классы библиотек, компоненты) без блокировок |
Сама entity типы во время работы не регистрирует; затрагивает приложения, которые делают это из заданий параллельно с работой entity |
#1765 |
Что делать на 2.2
- Вызывать
МенеджерСущностей.Инициализировать() (или любую операцию с БД) в основном потоке до
запуска фоновых заданий и веб-сервера: sql загрузится один раз, до параллельной работы.
- В наблюдателях, получающих события при завершении потока, не работать с другими источниками
данных.
- Обработчики
ПриЗавершении в прикладном коде не должны бросать исключений.
Версия: entity 5.4.0.1, OneScript 2.2.0.
Аудит потокобезопасности entity нашел ошибки в самом движке. Все они исправлены PR в
EvilBeaver/OneScript(на 2026-10-02 открыты); до выхода версии с ними entity на 2.2 работает соговорками ниже.
ПриЗавершениивызывает обработчики по живому списку: подписка или отписка во время события дает «Collection was modified», и оставшиеся обработчики не вызываютсяПриЗавершенииотменяет все следующиеИсточникДанныхпри сбое закрытия и журнала), падает — и пул не возвращает соединения завершившегося потокаsqlподключается лениво:#Использовать sqlесть только в служебном конструкторе коннектора, который компилируется при открытии соединения, вне блокировки пула. Если первые соединения процесса открываются параллельно (например, источник инициализируется лениво в обработчиках запросов), открытие соединения падаетПодключитьСценарий, классы библиотек, компоненты) без блокировокЧто делать на 2.2
МенеджерСущностей.Инициализировать()(или любую операцию с БД) в основном потоке дозапуска фоновых заданий и веб-сервера:
sqlзагрузится один раз, до параллельной работы.данных.
ПриЗавершениив прикладном коде не должны бросать исключений.