Skip to content

fix(connector): транзакция, брошенная алгоритмом прямого доступа, откатывается - #161

Open
sfaqer wants to merge 1 commit into
nixel2007:masterfrom
sfaqer:claude/thread-safety-a1-connector-transaction
Open

sfaqer wants to merge 1 commit into
nixel2007:masterfrom
sfaqer:claude/thread-safety-a1-connector-transaction

Conversation

@sfaqer

@sfaqer sfaqer commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

Часть разбиения #154 (1 из 4): транзакция, брошенная алгоритмом прямого доступа.

Что чинит

Алгоритм ВыполнитьСКоннектором мог начать транзакцию — методом Коннектор.НачатьТранзакцию() или запросом BEGIN — и не завершить её. Транзакция уходила вместе с соединением к другому потоку.

Как проявлялось на master Исправление
PostgreSQL: COMMIT другого потока фиксировал строки алгоритма. SQLite: другой поток падал на своём BEGIN с «cannot start a transaction within a transaction» SQL-коннектор сам ведёт признак транзакции по выполненным запросам: BEGIN/START открывают, COMMIT/END/ROLLBACK закрывают, ROLLBACK TO не закрывает. Пул спрашивает признак через ВТранзакции() и откатывает брошенную транзакцию при возврате соединения

Ломающее изменение (Major.Connector)

ВТранзакции() — новый обязательный метод интерфейса АбстрактныйКоннектор. Коннектор без транзакций отвечает Ложь. Сторонний коннектор без этого метода отвергается при создании ИсточникДанных. По схеме версий из README это смена второй цифры версии; packagedef здесь не меняется.

Что ещё меняется снаружи

  • Наблюдатели увидят запрос ROLLBACK брошенной транзакции. События транзакции у неё нет: начинала её не библиотека.
  • ОперацияИзТекста разбивает текст ещё и по ;, табуляции и CR, поэтому begin; узнаётся как BEGIN.
  • Документация: раздел о транзакциях в прямом доступе в ПотокобезопаснаяРаботаСБД.md, описания ВТранзакции у коннекторов и в README.

Тесты

  • ДоступКоннектором — брошенная транзакция в четырёх вариантах: методом коннектора, BEGIN, begin;, с ROLLBACK TO. На master красные. Плюс страховочный тест: транзакция, которую алгоритм завершил сам, сохраняется.
  • ИсточникДанных.КоннекторБезПризнакаТранзакцииОтвергается — красный на master.
  • Мутант «ROLLBACK TO закрывает транзакцию» тест поймал.

Полный прогон без PostgreSQL (Docker на машине был выключен, PostgreSQL проверяет CI): OneScript 2.2.0 — 305 из 305, 2.3.0-next+a02323a1 — 305 из 305.

🤖 Generated with Claude Code

…атывается

Алгоритм ВыполнитьСКоннектором мог начать транзакцию методом коннектора или
запросом BEGIN и не завершить ее: она уходила с соединением к другому потоку,
и его COMMIT фиксировал строки алгоритма. SQL-коннектор теперь сам ведет
признак транзакции по выполненным запросам (BEGIN/START открывают,
COMMIT/END/ROLLBACK закрывают, ROLLBACK TO - нет), а пул по ВТранзакции()
откатывает брошенную транзакцию при возврате соединения.

ВТранзакции() - обязательный метод интерфейса АбстрактныйКоннектор: коннектор
без транзакций отвечает Ложь, сторонний коннектор без метода отвергается при
создании ИсточникДанных (смена Major.Connector).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Oct 6, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 19 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used the included review currently available.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 0078b0a4-0147-4189-bb02-bc4997768741
📥 Commits

Reviewing files that changed from the base of the PR and between 8241fc5 and 583445d.

📒 Files selected for processing (21)
  • README.md
  • docs/АбстрактныйКоннектор.md
  • docs/КоннекторJSON.md
  • docs/КоннекторSQLite.md
  • docs/ПотокобезопаснаяРаботаСБД.md
  • src/internal/Классы/СоединениеСБД.os
  • src/Классы/АбстрактныйКоннектор.os
  • src/Классы/АбстрактныйКоннекторSQL.os
  • src/Классы/КоннекторInMemory.os
  • src/Классы/КоннекторJSON.os
  • src/Классы/КоннекторPostgreSQL.os
  • src/Классы/КоннекторSQLite.os
  • tests/fixtures/КоннекторБезНаблюдения.os
  • tests/fixtures/КоннекторБезПризнакаТранзакции.os
  • tests/fixtures/КоннекторНеполноНаблюдаемый.os
  • tests/fixtures/КоннекторСЛоманымОписанием.os
  • tests/fixtures/КоннекторСобытиемПриПодключении.os
  • tests/fixtures/КоннекторТранзакцийДляТестов.os
  • tests/fixtures/КоннекторУправляемоеОткрытие.os
  • tests/ДоступКоннектором.os
  • tests/ИсточникДанных.os
  • Autopilot · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant