use lock_db::prelude::*;
fn main() {
let lm = LockManager::new();
let row = ResourceId::new(1);
let me = TxnId::new(1);
lm.try_acquire(me, row, LockMode::Shared).expect("row free");
println!("txn {} holds row {} shared", me.get(), row.get());
lm.try_acquire(me, row, LockMode::Exclusive)
.expect("sole holder can upgrade");
assert_eq!(lm.mode_held(me, row), Some(LockMode::Exclusive));
println!("txn {} upgraded row {} to exclusive", me.get(), row.get());
lm.release(me, row).expect("we hold the row");
let other = TxnId::new(2);
lm.try_acquire(me, row, LockMode::Shared).expect("row free");
lm.try_acquire(other, row, LockMode::Shared)
.expect("shared locks coexist");
match lm.try_acquire(me, row, LockMode::Exclusive) {
Err(LockError::Conflict) => {
println!(
"upgrade refused: another reader still holds row {}",
row.get()
);
assert_eq!(lm.mode_held(me, row), Some(LockMode::Shared));
}
other => panic!("expected a conflict, got {other:?}"),
}
lm.release_all(me);
lm.release_all(other);
}