-
Notifications
You must be signed in to change notification settings - Fork 1
features_transactions
ACID-konforme Transaktionen �ber alle Index-Typen mit MVCC, Snapshot-Isolation und Konflikterkennung.
- ?? �bersicht
- ? Features
- ?? Schnellstart
- ?? Detaillierte Dokumentation
- ?? Best Practices
- ?? Troubleshooting
- ?? Siehe auch
- ?? Changelog
THEMIS bietet ACID-konforme Transaktionen mit umfassender Unterst�tzung f�r alle Index-Typen:
- Atomicity: All-or-nothing Ausf�hrung aller Operationen
- MVCC & Isolation: ReadCommitted und Snapshot-Isolation mit konsistentem Sichtfenster
- Konflikterkennung: Automatische Write-Write-Konflikt-Erkennung
- Session-Management: Eindeutige Transaction-IDs und Session-Tracking
- Multi-Index Support: Konsistente Updates �ber Secondary, Graph und Vector-Indizes
- Atomicity: Alle Operationen innerhalb einer Transaktion werden atomar ausgef�hrt (all-or-nothing)
- MVCC & Isolation: ReadCommitted (default) und Snapshot-Isolation mit konsistentem Sichtfenster
- Konflikterkennung: Write-Write-Konflikte werden beim Commit/Put erkannt und f�hren zu Fehlern/Abbr�chen
- Session-Management: Transaktionen sind �ber eindeutige Transaction-IDs identifizierbar
- Statistics Tracking: Umfassende Metriken (begun, committed, aborted, durations, success rate)
- Auto-Rollback: RAII-Pattern f�r automatisches Rollback bei Exception/Destruktion
- Multi-Index Support: Konsistente Updates �ber Secondary, Graph und Vector-Indizes
| Feature | Beschreibung | Status |
|---|---|---|
| ACID-Transaktionen | Vollst�ndig ACID-konform �ber alle Index-Typen | ? Implementiert |
| MVCC | Multi-Version Concurrency Control | ? Implementiert |
| Snapshot-Isolation | Konsistente Snapshot-Sichtfenster | ? Implementiert |
| Konflikterkennung | Automatische Write-Write-Erkennung | ? Implementiert |
| Statistics Tracking | Metriken f�r Monitoring | ? Implementiert |
| Auto-Rollback | RAII-Pattern f�r automatisches Rollback | ? Implementiert |
# 1. Server starten
./themis_server --config config.json
# 2. Transaktion starten und committen
curl -X POST http://localhost:8080/api/transactions \
-d '{"isolation_level": "snapshot_isolation"}'
# 3. Operationen durchf�hren und commit
curl -X PUT http://localhost:8080/api/transactions/{tx_id}/commitZentrale Komponente f�r Session-basiertes Transaction-Management:
class TransactionManager {
public:
// Session-based API (empfohlen f�r HTTP/Multi-Client)
TransactionId beginTransaction(IsolationLevel isolation = IsolationLevel::ReadCommitted);
Status commitTransaction(TransactionId id);
void rollbackTransaction(TransactionId id);
std::shared_ptr<Transaction> getTransaction(TransactionId id);
// Direct API (f�r Single-Threaded/Embedded)
Transaction begin(IsolationLevel isolation = IsolationLevel::ReadCommitted);
// Statistics
Stats getStats() const;
void cleanupOldTransactions(std::chrono::seconds max_age);
};Stellt Operationen innerhalb einer Transaktion bereit:
class Transaction {
public:
// Metadata
TransactionId getId() const;
IsolationLevel getIsolationLevel() const;
uint64_t getDurationMs() const;
// Relational Operations
Status putEntity(std::string_view table, const BaseEntity& entity);
Status eraseEntity(std::string_view table, std::string_view pk);
// Graph Operations
Status addEdge(const BaseEntity& edgeEntity);
Status deleteEdge(std::string_view edgeId);
// Vector Operations
Status addVector(const BaseEntity& entity, std::string_view vectorField = "embedding");
Status updateVector(const BaseEntity& entity, std::string_view vectorField = "embedding");
Status removeVector(std::string_view pk);
// Finalization
Status commit();
void rollback();
};- Lesezugriffe sehen nur committed data
- Keine Dirty Reads
- Non-Repeatable Reads m�glich
- Geeignet f�r: Standard OLTP-Workloads
- Point-in-time Konsistenz (Sichtfenster fixiert beim Begin)
- Repeatable Reads innerhalb der Transaktion
- H�here Isolation, potenziell h�herer Overhead
- Geeignet f�r: Analytische Queries, konsistente Reports
Startet eine neue Transaktion.
Request:
{
"isolation": "read_committed" // optional, default: "read_committed"
}Response:
{
"transaction_id": 42,
"isolation": "read_committed",
"status": "begun"
}cURL Beispiel:
curl -X POST http://localhost:8080/transaction/begin \
-H "Content-Type: application/json" \
-d '{"isolation": "snapshot"}'Committed eine Transaktion.
Request:
{
"transaction_id": 42
}Response (Success):
{
"transaction_id": 42,
"status": "committed",
"message": "Transaction committed successfully"
}Response (Error):
{
"transaction_id": 42,
"status": "error",
"error": "Transaction not found or already completed"
}cURL Beispiel:
curl -X POST http://localhost:8080/transaction/commit \
-H "Content-Type: application/json" \
-d '{"transaction_id": 42}'Rollt eine Transaktion zur�ck.
Request:
{
"transaction_id": 42
}Response:
{
"transaction_id": 42,
"status": "rolled_back",
"message": "Transaction rolled back successfully"
}cURL Beispiel:
curl -X POST http://localhost:8080/transaction/rollback \
-H "Content-Type: application/json" \
-d '{"transaction_id": 42}'Liefert Statistiken �ber alle Transaktionen.
Response:
{
"total_begun": 1523,
"total_committed": 1401,
"total_aborted": 122,
"active_count": 3,
"avg_duration_ms": 45,
"max_duration_ms": 523,
"success_rate": 0.92
}cURL Beispiel:
curl http://localhost:8080/transaction/statsProblem: Mehrere Entities mit verschiedenen Indizes m�ssen atomar gespeichert werden.
L�sung:
# Begin transaction
TXN_ID=$(curl -s -X POST http://localhost:8080/transaction/begin | jq -r '.transaction_id')
# Insert entities via transaction (hypothetisch - API-Erweiterung erforderlich)
# Aktuell: Direkte C++ API verwenden
# C++ Code:
auto txn_id = tx_manager->beginTransaction();
auto txn = tx_manager->getTransaction(txn_id);
BaseEntity user("user123");
user.setField("name", std::string("Alice"));
user.setField("city", std::string("Berlin"));
txn->putEntity("users", user);
BaseEntity order("order456");
order.setField("user_id", std::string("user123"));
order.setField("total", 99.99);
txn->putEntity("orders", order);
// Commit via HTTP
curl -X POST http://localhost:8080/transaction/commit \
-d "{\"transaction_id\": $TXN_ID}"Problem: Mehrere Graph-Edges sollen atomar hinzugef�gt werden, bei Fehler Rollback.
C++ Beispiel:
auto txn_id = tx_manager->beginTransaction();
auto txn = tx_manager->getTransaction(txn_id);
try {
// Add multiple edges
BaseEntity edge1("edge1");
edge1.setField("_from", std::string("user1"));
edge1.setField("_to", std::string("user2"));
edge1.setField("type", std::string("follows"));
txn->addEdge(edge1);
BaseEntity edge2("edge2");
edge2.setField("_from", std::string("user1"));
edge2.setField("_to", std::string("user3"));
edge2.setField("type", std::string("follows"));
txn->addEdge(edge2);
// Validate business logic
if (!validateFollowerLimit(txn)) {
tx_manager->rollbackTransaction(txn_id);
return Status::Error("Follower limit exceeded");
}
// Commit if all OK
return tx_manager->commitTransaction(txn_id);
} catch (...) {
tx_manager->rollbackTransaction(txn_id);
throw;
}Problem: Vector-Embedding und Metadaten sollen atomar gespeichert werden.
C++ Beispiel:
auto txn_id = tx_manager->beginTransaction();
auto txn = tx_manager->getTransaction(txn_id);
// Document with embedding
BaseEntity doc("doc123");
doc.setField("title", std::string("AI Research Paper"));
doc.setField("author", std::string("Dr. Smith"));
std::vector<float> embedding = {0.23f, 0.45f, 0.67f, /* ... 768 dims */};
doc.setField("embedding", embedding);
// Store entity (relational)
auto status = txn->putEntity("documents", doc);
if (!status.ok) {
tx_manager->rollbackTransaction(txn_id);
return status;
}
// Store vector (vector index)
status = txn->addVector(doc, "embedding");
if (!status.ok) {
tx_manager->rollbackTransaction(txn_id);
return status;
}
// Commit both atomically
return tx_manager->commitTransaction(txn_id);Problem: Vergessene/abgest�rzte Clients hinterlassen offene Transaktionen.
Best Practice:
// Periodischer Cleanup (z.B. via Cronjob oder Background-Thread)
tx_manager->cleanupOldTransactions(std::chrono::hours(1));
// Metriken �berwachen
auto stats = tx_manager->getStats();
if (stats.active_count > 100) {
THEMIS_WARN("High number of active transactions: {}", stats.active_count);
}HTTP Monitoring:
# Statistiken abrufen
curl http://localhost:8080/transaction/stats | jq '.active_count'
# Alert bei hoher Anzahl
if [ $(curl -s http://localhost:8080/transaction/stats | jq '.active_count') -gt 50 ]; then
echo "WARNING: Too many active transactions"
fi- Snapshot-Verwaltung und Konflikterkennung erzeugen geringen Overhead gegen�ber einfachen Writes
- Benefit: Korrektheit unter Parallelit�t (kein Last-Write-Wins), konsistente Sicht
| Isolation Level | Read Overhead | Write Overhead | Use Case |
|---|---|---|---|
| ReadCommitted | Minimal | Minimal | OLTP, Standard-Queries |
| Snapshot | +5-10% | +5-10% | Reports, Analytics |
- Secondary Index: ~0.05ms pro Index-Entry (Put/Delete)
- Graph Index: ~0.1ms pro Edge (2x Index-Entries: out + in)
- Vector Index: ~0.5-2ms (abh�ngig von HNSW-Parametern, Dimension)
Problem:
Der Vector-Index h�lt einen In-Memory Cache (HNSW-Struktur, cache_ map). Bei Rollback werden RocksDB-�nderungen r�ckg�ngig gemacht, aber der Cache bleibt inkonsistent.
Auswirkung:
- Nach Rollback k�nnen Vector-Searches falsch-positive Ergebnisse liefern
- Cache enth�lt Vektoren, die in RocksDB nicht existieren
Workaround:
// Nach Rollback: Vector-Index neu laden
vector_index->rebuildFromStorage();Zuk�nftige Verbesserung:
Callback-Mechanismus f�r commit/rollback, um Cache synchron zu halten.
Verhalten:
Write-Write-Konflikte werden erkannt und f�hren zu Fehlern beim Commit/Put. Clients sollten Retry-Logik mit Backoff implementieren, wenn eine Transaktion aufgrund eines Konflikts abgelehnt wird.
Limitation:
Keine automatischen Timeouts f�r aktive Transaktionen implementiert.
Empfehlung:
// Client-seitig: Timeout �berwachen
auto start = std::chrono::system_clock::now();
auto txn_id = tx_manager->beginTransaction();
// ... operations ...
auto duration = std::chrono::system_clock::now() - start;
if (duration > std::chrono::seconds(30)) {
tx_manager->rollbackTransaction(txn_id);
return Status::Error("Transaction timeout");
}auto status = tx_manager->commitTransaction(txn_id);
if (!status.ok) {
// M�gliche Ursachen:
// - Transaction nicht gefunden
// - Bereits committed/rolled back
// - RocksDB Write-Fehler (Disk-Full, Permissions)
THEMIS_ERROR("Commit failed: {}", status.message);
// Cleanup
tx_manager->rollbackTransaction(txn_id); // Safe auch bei bereits abgeschlossener Txn
}# Retry-Logic mit Exponential Backoff
for i in {1..3}; do
if curl -X POST http://localhost:8080/transaction/commit \
-d "{\"transaction_id\": $TXN_ID}" \
--max-time 5; then
break
fi
sleep $((2**i))
done{
auto txn = tx_manager->begin(); // Direct API
txn.putEntity("users", user);
// Exception thrown -> Destruktor ruft automatisch rollback()
throw std::runtime_error("Business logic error");
} // txn Destruktor: THEMIS_WARN + rollback()Transaction-Statistiken sind via /metrics Endpoint verf�gbar:
# TYPE vccdb_transactions_begun_total counter
vccdb_transactions_begun_total 1523
# TYPE vccdb_transactions_committed_total counter
vccdb_transactions_committed_total 1401
# TYPE vccdb_transactions_aborted_total counter
vccdb_transactions_aborted_total 122
# TYPE vccdb_transactions_active gauge
vccdb_transactions_active 3
# TYPE vccdb_transaction_duration_ms histogram
vccdb_transaction_duration_ms_bucket{le="10"} 834
vccdb_transaction_duration_ms_bucket{le="50"} 1245
vccdb_transaction_duration_ms_bucket{le="100"} 1398
vccdb_transaction_duration_ms_bucket{le="+Inf"} 1523
vccdb_transaction_duration_ms_sum 68035
vccdb_transaction_duration_ms_count 1523
Empfohlene Metriken:
-
Transaction Rate:
rate(vccdb_transactions_begun_total[5m]) -
Success Rate:
vccdb_transactions_committed_total / vccdb_transactions_begun_total -
Active Transactions:
vccdb_transactions_active -
Avg Duration:
vccdb_transaction_duration_ms_sum / vccdb_transaction_duration_ms_count
Vorher (Direct):
auto txn = tx_manager->begin();
txn.putEntity("users", user);
txn.commit();Nachher (Session-based, HTTP-kompatibel):
auto txn_id = tx_manager->beginTransaction();
auto txn = tx_manager->getTransaction(txn_id);
txn->putEntity("users", user);
tx_manager->commitTransaction(txn_id);Vorteil: Transaction-ID kann �ber HTTP/Network �bertragen werden.
- Architecture Overview - Systemarchitektur
- MVCC Design - Hintergr�nde & Optionen
- RocksDB Storage - WAL/Snapshots/Compaction
- Deployment Guide - Production Setup
- OpenAPI Specification - Vollst�ndige API-Referenz
- Base Entity Documentation - Entity-Serialisierung
- Initial release
- Session-based Transaction Management
- Isolation Levels: ReadCommitted, Snapshot
- Multi-Index Support: Secondary, Graph, Vector
- HTTP REST API: begin, commit, rollback, stats
- Comprehensive Statistics & Monitoring
- 23 Unit-Tests (100% Pass-Rate)
| ? Empfohlen | ? Vermeiden |
|---|---|
| Dokumentierte Best Practices | Anti-Patterns ignorieren |
| Regelm��iges Testing | Deployment ohne Tests |
| Monitoring aktivieren | Blind Deployments |
H�ufige Probleme
Siehe Logs f�r Details.
| Version | Datum | �nderungen |
|---|---|---|
| v1.3.0 | 2025-12-22 | Template-Aktualisierung f�r v1.3.0 Standard |
Letzte Aktualisierung: 22. Dezember 2025
Autor: ThemisDB Team
Status: Produktiv
| ✅ Empfohlen | ❌ Vermeiden |
|---|---|
| Dokumentierte Best Practices | Anti-Patterns ignorieren |
| Regelmäßiges Testing | Deployment ohne Tests |
| Monitoring aktivieren | Blind Deployments |
Häufige Probleme
Siehe Logs für Details.
| Version | Datum | Änderungen |
|---|---|---|
| v1.3.0 | 2025-12-22 | Template-Aktualisierung für v1.3.0 Standard |
Letzte Aktualisierung: 22. Dezember 2025
Autor: ThemisDB Team
Status: ✅ Produktiv
- Architecture-ACCESS-MODEL-IMPLEMENTATION-SUMMARY
- Architecture-ADR-003-pg-dump-sql-parser
- Architecture-BASEENTITY-PRINCIPLE
- Architecture-CACHE-STORAGE-INTEGRATION
- Architecture-CMAKE-ARCHITECTURE
- Architecture-CMAKE-FLAGS-REFERENCE
- Architecture-CMAKE-MODULAR-ARCHITECTURE
- Architecture-CONCERNS-ARCHITECTURE-DIAGRAM
- Architecture-CONCERNS-IMPLEMENTATION-SUMMARY
- Architecture-CONTENT-MODEL
- Architecture-COPILOT-THEMISDB-GRAPH-RAG-BACKEND-ARCHITECTURE
- Architecture-CRYPTO-AND-KEYS
- Architecture-FEATURE-FLAGS-REFERENCE
- Architecture-GPU-ARCHITECTURE-REVIEW-TEMPLATE
- Architecture-HTTP-SHUTDOWN-HARDENING
- Architecture-MIGRATION-GUIDE-CONCERNS
- Architecture-MIGRATION-GUIDE-v13-v14
- Architecture-MODULARIZATION-GUIDE
- Architecture-MODULAR-ARCHITECTURE-ROADMAP
- Architecture-MODULE-ARCHITECTURE-INDEX
- Architecture-P1D01-ISSMPLUGIN-DESIGN-REVIEW
- Architecture-P1-D01-ISSMPLUGIN-DESIGN-REVIEW
- Architecture-P1-D08-MAMBA-GOVERNANCE-CONTRACT
- Architecture-P1-P2-IMPLEMENTATION-COMPLETION-INDEX
- Architecture-PHASE0-COMPLETION-ASSESSMENT
- Architecture-PHASE3-QUERYENGINE-DI-ARCHITECTURE
- Architecture-PHASE4-INDEX-MANAGER-DI
- Architecture-POSTGRESQL-WIRE-PROTOCOL
- Architecture-QUERYENGINE-IMPLEMENTATION-GUIDE
- Architecture-QUERY-SCHEDULING
- Architecture-RAFT-CONSENSUS-DESIGN
- Architecture-README
- Architecture-README-SSM-HYBRID-IMPLEMENTATION
- Architecture-REFACTORING-SUMMARY
- Architecture-RESOURCE-POOLING
- Architecture-SOURCE-DIRECTORY-GUIDE
- Architecture-THEMIS-CORE-GUIDE
- Architecture-UNIFIED-ACCESS-MODEL
- Architecture-WAL-GRPC-MTLS-CONFIGURATION
- Architecture-WIRE-PROTOCOL-RETRY
- Architecture-boltzmann-observability-draft
- Architecture-experimental-logarithmic-vector-storage
- Architecture-llm-wiki-mvp-adr
- Architecture-rewrite-engine-architecture
- Architecture-rope-api-architecture
- Architecture-ssm-gguf-mamba-status
- Architecture-ssm-hybrid-analysis
- Architecture-ssm-hybrid-rollout-plan
- Architecture-ssm-plugin-interface-design-review
- Architecture-transaction-coordinators
- Architecture-wiki-secondary-index
- Architecture-wire-protocol
- Governance-DISABLED-STUB-POLICY
- Governance-DOCS-PR-POLICY
- Governance-GA-PROMOTION-SIGN-OFF
- Governance-GITHUB-MILESTONES-SETUP
- Governance-MATURITY-CLAIM-VERIFICATION-CHECKLIST
- Governance-MATURITY-EVIDENCE-REGISTRY
- Governance-MERGE-GATE-BOT-CONFIG
- Governance-MERGE-GATE-STATUS-LIVE
- Governance-PHASE3-ENFORCEMENT-RUNBOOK
- Governance-PHASE-1-CLOSURE-REPORT
- Governance-PHASE-CLOSURE-POLICY
- Governance-PHASE-DEPENDENCY-GRAPH
- Governance-PLUGIN-SUBMODULE-ROLLBACK
- Governance-PRODUCTION-READY-2026-DELIVERY-PLAN
- Governance-PR-VERSION-TARGETING
- Governance-PR-VERSION-TARGETING-BACKFILL
- Governance-QUERY-MODULE-STATUS
- Governance-README
- Governance-RELEASE-PROMOTION-GATE-POLICY
- Governance-RELEASE-VALIDATION-CHECKLIST
- Governance-SECURITY-MODULE-5671-EVIDENCE-SUMMARY
- Governance-SHARDING-P6-RESIDUAL-RISK-ACCEPTANCE
- Governance-SOURCECODE-COMPLIANCE-GOVERNANCE
- Governance-UPDATES-DEVELOPMENT-STATUS-SIGN-OFF
- Governance-WAVE-C-IMPLEMENTATION-COMPLETE
- Module-acceleration-Roadmap
- Module-access-model-Roadmap
- Module-ai-Roadmap
- Module-analytics-Roadmap
- Module-api-Roadmap
- Module-aql-Roadmap
- Module-auth-Roadmap
- Module-base-Roadmap
- Module-cache-Roadmap
- Module-cdc-Roadmap
- Module-chaos-Roadmap
- Module-chimera-Roadmap
- Module-config-Roadmap
- Module-content-Roadmap
- Module-core-Roadmap
- Module-distributed-knowledge-Roadmap
- Module-distributed-tensor-Roadmap
- Module-document-Roadmap
- Module-ethics-ai-Roadmap
- Module-evaluation-Roadmap
- Module-execution-Roadmap
- Module-exporters-Roadmap
- Module-failover-Roadmap
- Module-geo-Roadmap
- Module-governance-Roadmap
- Module-gpu-Roadmap
- Module-graph-Roadmap
- Module-image-analysis-Roadmap
- Module-importers-Roadmap
- Module-index-Roadmap
- Module-ingestion-Roadmap
- Module-llama-cpp-Roadmap
- Module-llm-Roadmap
- Module-llm-streaming-Roadmap
- Module-llm-wiki-Roadmap
- Module-maintenance-Roadmap
- Module-metadata-Roadmap
- Module-network-Roadmap
- Module-observability-Roadmap
- Module-onnx-clip-Roadmap
- Module-performance-Roadmap
- Module-plugins-Roadmap
- Module-process-Roadmap
- Module-projects-Roadmap
- Module-prompt-engineering-Roadmap
- Module-query-Roadmap
- Module-rag-Roadmap
- Module-replication-Roadmap
- Module-retrieval-Roadmap
- Module-rpc-grpc-Roadmap
- Module-scheduler-Roadmap
- Module-scraper-Roadmap
- Module-search-Roadmap
- Module-security-Roadmap
- Module-server-Roadmap
- Module-sharding-Roadmap
- Module-stable-diffusion-Roadmap
- Module-storage-Roadmap
- Module-temporal-Roadmap
- Module-tensor-Roadmap
- Module-themis-Roadmap
- Module-timeseries-Roadmap
- Module-toolbox-Roadmap
- Module-training-Roadmap
- Module-transaction-Roadmap
- Module-updates-Roadmap
- Module-user-storage-encrypted-Roadmap
- Module-utils-Roadmap
- Module-vector-search-Roadmap
- Module-voice-Roadmap
- Module-whisper-Roadmap