Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

LangGraph SQLite partial-commit reproduction

This fixture reproduces the transaction-boundary problem reported in LangGraph issue #8590: SqliteStore.batch() can raise on a later operation while an earlier mutation in the same batch remains committed.

Scope

  • Package: langgraph-checkpoint-sqlite==3.1.1
  • Path tested by XBSTACK: synchronous SqliteStore.batch()
  • Database: in-memory SQLite
  • Network/API/model calls: none
  • Date independently reproduced: 2026-08-12

The upstream issue also reports the equivalent behavior for AsyncSqliteStore.abatch(). XBSTACK has not independently rerun the async reproduction in this fixture yet, so this repository does not claim an independent async verification.

Run

python -m venv .venv
. .venv/bin/activate
pip install -r requirements.txt
python repro/repro_sync.py

Expected output on the affected version:

langgraph-checkpoint-sqlite 3.1.1
caught TypeError
original_expiration 2000-01-01 00:00:00
actual_expiration <a newer timestamp>
partial_commit_reproduced True

The important result is not the exact refreshed timestamp. It is that actual_expiration differs from original_expiration even though the batch raised TypeError.

Why this matters

A caller can reasonably assume a failed batch did not persist any earlier mutation. On the affected path that assumption is unsafe: an earlier TTL refresh can survive a later serialization failure, leaving the store partially updated.

Until an upstream fixed release is independently verified, do not treat SqliteStore.batch() as an atomic transaction boundary for failure-sensitive application logic. Pre-validate fallible inputs where possible, avoid mixing earlier mutations with later operations that can fail when atomicity matters, and add a pinned regression test before upgrading or removing any application-level guard.

Evidence boundary

This fixture demonstrates one deterministic partial-commit path. It does not prove that every batch() workload partially commits, and it does not establish that SQLite itself is at fault. The upstream report identifies the LangGraph SQLite store cursor context managers' unconditional COMMIT behavior as the implementation-level cause and proposes rollback-on-exception semantics.

Upstream and write-up

See version-matrix.md and logs/ for the pinned verification record.

About

Deterministic reproduction for LangGraph SqliteStore.batch() partial commits after a later operation fails

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages