.tasks/core/LSYNC-006-transaction-manager-core.md
Implement the TransactionManager for atomic database writes with automatic sync broadcasts. In the leaderless model, all devices can write - no leader checks needed!
Architecture Change: No longer checks for leader role. All devices broadcast their changes directly.
TransactionManager struct with event buscommit_device_owned<M>() for device-owned data:
commit_shared<M>() for shared resources:
commit_batch<M>() for batchingwith_tx() for raw SQL compatibilitycore/src/infra/transaction/manager.rsdevice_id fieldimpl TransactionManager {
/// Commit device-owned resource (state-based)
pub async fn commit_device_owned<M: Syncable>(
&self,
library: Arc<Library>,
model: M,
) -> Result<M, TxError> {
// 1. Write to database
let saved = db.transaction(|txn| {
model.insert(txn).await
}).await?;
// 2. Broadcast state (no log!)
self.broadcast_state_change(saved.clone()).await?;
// 3. Emit event
self.event_bus.emit(Event::ResourceChanged { ... });
Ok(saved)
}
/// Commit shared resource (log-based with HLC)
pub async fn commit_shared<M: Syncable>(
&self,
library: Arc<Library>,
model: M,
) -> Result<M, TxError> {
// 1. Generate HLC
let hlc = self.hlc_generator.lock().await.next();
// 2. Atomic: DB write + log entry
let saved = db.transaction(|txn| async {
let saved = model.insert(txn).await?;
// Write to sync log
sync_db.append(SharedChangeEntry {
hlc,
model_type: M::SYNC_MODEL,
record_uuid: saved.sync_id(),
change_type: ChangeType::Insert,
data: serde_json::to_value(&saved)?,
}, txn).await?;
Ok(saved)
}).await?;
// 3. Broadcast with HLC
self.broadcast_shared_change(hlc, saved.clone()).await?;
// 4. Emit event
self.event_bus.emit(Event::ResourceChanged { ... });
Ok(saved)
}
}
Successfully implemented in core/src/infra/sync/transaction.rs:
commit_device_owned() - Emits events for state-based broadcastcommit_shared() - Generates HLC, writes to peer log, emits events for broadcastRemove:
next_sequence() method (replaced with HLC)is_leader() checksAdd:
core/src/infra/sync/NEW_SYNC.md - Leaderless architecture