use lock_db::prelude::*;
fn main() {
let lm = LockManager::new();
let index = ResourceId::new(1);
let reader = TxnId::new(1);
let scanned = KeyRange::new(100, 200).unwrap();
lm.try_acquire_range(reader, index, scanned, LockMode::Shared)
.expect("range is free");
println!("reader holds a shared lock over keys [100, 200]");
let reader2 = TxnId::new(2);
lm.try_acquire_range(
reader2,
index,
KeyRange::new(150, 250).unwrap(),
LockMode::Shared,
)
.expect("shared ranges overlap freely");
println!("a second reader shares the overlapping range [150, 250]");
let writer = TxnId::new(3);
match lm.try_acquire_range(writer, index, KeyRange::point(150), LockMode::Exclusive) {
Err(LockError::Conflict) => println!("writer blocked from inserting key 150 (no phantom)"),
other => panic!("expected conflict, got {other:?}"),
}
lm.try_acquire_range(writer, index, KeyRange::point(500), LockMode::Exclusive)
.expect("key 500 is outside any locked range");
println!("writer inserts key 500 outside the locked range");
lm.release_all(reader);
lm.release_all(reader2);
lm.try_acquire_range(writer, index, KeyRange::point(150), LockMode::Exclusive)
.expect("range is free after readers commit");
println!("after readers commit, the writer inserts key 150");
lm.release_all(writer);
}