use lock_db::prelude::*;
const DB: ResourceId = ResourceId::new(1);
const TABLE: ResourceId = ResourceId::new(2);
const PAGE: ResourceId = ResourceId::new(3);
const ROW: ResourceId = ResourceId::new(4);
fn main() {
let lm = LockManager::new();
let writer = TxnId::new(1);
for node in [DB, TABLE, PAGE] {
lm.try_acquire(writer, node, LockMode::IntentionExclusive)
.expect("intention path is free");
}
lm.try_acquire(writer, ROW, LockMode::Exclusive)
.expect("row is free");
println!("writer holds IX on db/table/page and X on the row");
let reader = TxnId::new(2);
for node in [DB, TABLE, PAGE] {
lm.try_acquire(reader, node, LockMode::IntentionShared)
.expect("IS coexists with IX");
}
println!("reader holds IS on db/table/page alongside the writer");
match lm.try_acquire(reader, ROW, LockMode::Shared) {
Err(LockError::Conflict) => println!("reader is correctly blocked from the locked row"),
other => panic!("expected conflict, got {other:?}"),
}
let n = lm.release_all(writer);
println!("writer released {n} locks at commit");
lm.release_all(reader);
lm.try_acquire(reader, ROW, LockMode::Shared)
.expect("row free after writer commits");
println!("reader now reads the row");
lm.release_all(reader);
}