use uuid::Uuid;
use std::time::Instant;
#[derive(Debug, Clone, PartialEq)]
pub enum IsolationLevel {
ReadCommitted,
Snapshot,
Serializable,
}
#[derive(Debug, Clone, PartialEq)]
pub enum TransactionStatus {
Active,
Committed,
RolledBack,
Conflicted,
}
#[derive(Debug)]
pub struct TransactionContext {
pub tx_id: Uuid,
pub session_id: Uuid,
pub isolation: IsolationLevel,
pub status: TransactionStatus,
pub started_at: Instant,
pub write_set: Vec<String>,
pub read_set: Vec<String>,
}
impl TransactionContext {
pub fn new(session_id: Uuid, isolation: IsolationLevel) -> Self {
Self {
tx_id: Uuid::new_v4(),
session_id,
isolation,
status: TransactionStatus::Active,
started_at: Instant::now(),
write_set: vec![],
read_set: vec![],
}
}
pub fn is_active(&self) -> bool {
self.status == TransactionStatus::Active
}
pub fn record_write(&mut self, key: impl Into<String>) {
self.write_set.push(key.into());
}
pub fn record_read(&mut self, key: impl Into<String>) {
self.read_set.push(key.into());
}
}