Skip to content

Wrap D1 fallback paths in batch() for multi-table write atomicity #60

@johlju

Description

@johlju

Problem

All multi-table DAL writes use db.transaction() for BetterSQLiteSession (local dev / tests) but fall back to sequential await calls on Cloudflare D1, which doesn't support Drizzle's transaction() API. This means D1 paths are non-atomic — a failure partway through can leave the database in an inconsistent state.

Affected functions

lib/dal/requirements.ts

Function Tables touched
createRequirement requirementAreas, requirements, requirementVersions, requirementVersionUsageScenarios, requirementVersionNormReferences
editRequirement (Draft path) requirements, requirementVersions, requirementVersionUsageScenarios, requirementVersionNormReferences
editRequirement (Published→new Draft path) requirements, requirementVersions, requirementVersionUsageScenarios, requirementVersionNormReferences
deleteDraftVersion requirementVersionUsageScenarios, requirementVersionNormReferences, requirementVersions, requirements
restoreVersion requirementVersions, requirementVersionUsageScenarios, requirementVersionNormReferences

lib/dal/requirement-packages.ts

Function Tables touched
deletePackage requirementPackageItems, packageNeedsReferences, requirementPackages
updatePackageItemFields deviations (read), requirementPackageItems (write)

Existing precedent

linkRequirementsToPackageWithD1Batch in requirement-packages.ts already implements the D1BatchClient.batch() pattern successfully, using getD1BatchClient() + raw prepared statements. This approach is proven and can be replicated.

Proposed approach

For each affected function, add a D1 batch path (using getD1BatchClient() + raw prepared statements) mirroring the existing linkRequirementsToPackageWithD1Batch pattern. The BetterSQLiteSession transaction paths remain unchanged.

References

  • Database writes instruction: .github/instructions/database-writes.instructions.md
  • Existing batch implementation: lib/dal/requirement-packages.tslinkRequirementsToPackageWithD1Batch

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions