ScalarDB 3.19 Release Notes
This page includes a list of release notes for ScalarDB 3.19.
v3.19.0​
Release date: August 2, 2026
Summary​
This release adds Consensus Commit recovery capabilities, including write-set logging, transaction finishing, and single-record recovery APIs, and improves recovery correctness when Coordinator state records are cleaned up. It also adds attribute-based authentication, OpenTelemetry support, the Transaction Coordinator node for Separated Cluster deployments, and Global Transaction API support in the Cluster client SDK. In addition, this release improves repairTable, active transaction management, Cluster upgrade and authentication behavior, and SQL SELECT execution, while fixing several Consensus Commit, Cluster rollback/pause, and SQL statement cache issues.
Community edition​
Enhancements​
- Added an opt-in
scalar.db.consensus_commit.coordinator.write_set_logging.enabledconfiguration that, when enabled, adds atx_write_setcolumn to the Coordinator table and populates it on commit/abort. This lays the groundwork for proactive transaction recovery. Existing Coordinator tables can be migrated by enabling the config and runningAdmin.repairCoordinatorTables(). (#3570 #3593) - Added the
DistributedTransactionManager#finishTransaction(String)API, which completes per-record post-commit recovery for a committed transaction and removes its Coordinator state row. It returnstruewhen the transaction was finished (or was already finished) andfalsewhen the transaction is not applicable because it carries no write set (for example, a transaction terminated viarollback()/abort()rather thancommit()); aTransactionExceptionis thrown when finishing fails. Note that this is a low-level operational API specific to the Consensus Commit transaction manager. Most applications should not call it directly; it is intended for advanced use cases. Callers are expected to understand the underlying transaction lifecycle and the implications of invoking this method directly. (#3567) - Added the
DistributedTransactionManager#recoverRecordAPI for recovering a single record left in an uncommitted state by a crashed transaction. Note that this is a low-level operational API specific to the Consensus Commit transaction manager. Most applications should not call it directly; it is intended for advanced use cases. Callers are expected to understand the underlying transaction lifecycle and the implications of invoking this method directly. (#3617)
Improvements​
- Improved
repairTableto skip rewriting a table's metadata when it is already up to date (and, for Cosmos DB, to skip updating the container indexing policy when it already matches), avoiding unnecessary writes. (#3613) - Fixed the Consensus Commit recovery and read paths to stay correct when Coordinator state records are removed by cleanup (for example, by
finishTransaction), preventing stale reads, spurious aborts, and a crash during group-commit lazy recovery. (#3650) - Added a configurable limit on the number of active transactions tracked by active transaction management (
scalar.db.active_transaction_management.max_active_transactions, default 10000), backed by a Caffeine cache with Window-TinyLFU eviction, and refreshed the idle timer on every transaction operation so long-running transactions are not reaped while still in use. (#3673)
Bug fixes​
- Accepts connection string starting with
jdbc:spannerto connect to Spanner (emulator, omni, and cloud instance) in addition to the already supportedjdbc:cloudspannerpattern. (#3559) - Fixed an issue in Consensus Commit where a
Getoperation using a secondary index could fail with anIllegalArgumentExceptionwhen another record with the same indexed value was concurrently being deleted and inserted. (#3607) - Fixed an issue in Consensus Commit where a read-only transaction could fail when coordinator write omission on read-only was disabled and coordinator group commit was enabled. (#3614)
- Fixed a bug where aborting an in-flight, group-committed transaction by ID via
DistributedTransactionManager.rollback(String)/abort(String)could be lost when the Coordinator group commit feature was enabled. (#3619) - Fixed an issue in the Consensus Commit transaction manager where a read could return a stale (pre-commit) value for a record whose writing transaction committed concurrently during lazy recovery. (#3621)
Enterprise edition​
Enhancements​
ScalarDB Cluster​
- Added attribute-based authentication.
- Added OpenTelemetry support.
- Added the Transaction Coordinator node for the new Separated Cluster deployment pattern, which drives two-phase commit across ScalarDB Clusters on behalf of applications using the one-phase transaction interface.
ScalarDB SQL​
- Added
@AutoConfigureBeforetoScalarDbJdbcConfigurationto explicitly declare auto-configuration ordering relative to Spring Boot's auto-configs.
Improvements​
ScalarDB Cluster​
- ScalarDB Cluster now repairs its authentication and ABAC system metadata tables at node startup to create the companion before-image secondary indexes required after upgrading, so deployments upgraded from an earlier version gain them automatically without a manual
repairTable(). - Fixed an issue where a cluster node failed to start when TLS was disabled but a CA root certificate path was still configured.
- Added support for the Global Transaction API on the ScalarDB Cluster client SDK. Applications can now use
GlobalTransactionManagerto run a single transaction that spans multiple processes, such as microservice transactions, where the Transaction Coordinator drives two-phase commit on their behalf. The same application code also works for transactions within a single ScalarDB Cluster, with only configuration selecting which. - Added a configurable expiration margin to the userpass auth-token cache so the ScalarDB Cluster client re-authenticates shortly before a cached token expires, reducing spurious authentication errors near token expiration.
- Added a fixed label to the Kubernetes Secrets that store data encryption keys for self encryption so that operators can select them with a label selector.
ScalarDB SQL​
- Enabled the read-only optimization for one-shot SELECT statements and SELECT-only batches.
Bug fixes​
ScalarDB Cluster​
- Fixed a bug where a
rollbackthat exceeded the cluster's request-forwarding hop limit was silently reported as successful instead of surfacing the failure, which could leave records prepared until lazy recovery. ABORTEDis new on the pause RPC. Every pause failure was previouslyFAILED_PRECONDITION. A failure caused by losing a race with another admin request is nowABORTED, which means the pause can simply be retried. Every pause failure also carries agoogle.rpc.ErrorInfodetail in the status trailers, withdomainset tocom.scalar.db.cluster.adminandreasonset to the outcome, so a caller can tell the outcomes apart without matching on the status code or the description text. In particular, a caller that unpauses to recover from a failed pause must skip that unpause when the reason isTIMED_OUT_STILL_PAUSED, because the server is still paused by an earlier request.- Upgraded the Bouncy Castle library and the grpc_health_probe binary to fix security issues: CVE-2025-14813, CVE-2026-5598, CVE-2026-25681, CVE-2026-27136, CVE-2026-27145, CVE-2026-33811, CVE-2026-33814, CVE-2026-39820, CVE-2026-39821, CVE-2026-39822, CVE-2026-39836, CVE-2026-42499, and CVE-2026-42504
ScalarDB SQL​
- Fixed a statement cache regression where non-parameterized DML statements occupied cache slots intended for parameterized SQL. Cache eligibility is now correctly gated on the presence of bind markers in the parsed SQL.