- 已发运
- 2026年11月8日 00:45 UTC
- 作者
- Kamo
- 承诺
- ae2e462
The first press of Finish failed with a 500 and the retry succeeded. Completion notices were composed INSIDE the signing transaction under a catch-all: their reads (sender, template, copy-link re-mint) hit YugabyteDB SQLState 40001 right after the signature rows were written, the repository marked the shared transaction rollback-only, the catch swallowed it, and the commit threw UnexpectedRollbackException - rolling back the whole signature. - EsignNoticeComposer (new bean): all notice DB work, REQUIRES_NEW + @RetryOnDbConflict, re-read by id, run from afterCommit. EsignNotificationService now only captures ids, schedules, and sends. Applies to completed, decoderd, voided and expired notices. - submit() and decoder() are @RetryOnDbConflict (shared-library advisor, outside the transaction), so any 40001 is retried in a new transaction. - The fail-soft flatten/certificate and usage-record catches now rethrow a transient conflict or a rollback-only state (DbConflicts.rethrowIfDoomed) instead of swallowing it into a poisoned commit. - SigningSurvivesDbConflictTest reproduces the swallowed-exception rollback on real transaction proxies and proves notices and submit survive a 40001.
