Expand description
A futures-aware read-write lock which supports transaction-specific versioning
The value to lock must implement Clone since the lock may keep track of multiple past
values after committing.
Example:
use futures::executor::block_on;
use txn_lock::*;
let lock = TxnLock::new("example", 0, "zero");
assert_eq!(*lock.try_read(0).expect("read"), "zero");
assert_eq!(lock.try_write(1).unwrap_err(), Error::WouldBlock);
block_on(lock.commit(&0));
{
let mut guard = lock.try_write(1).expect("write lock");
*guard = "one";
}
assert_eq!(*lock.try_read(0).expect("read past version"), "zero");
assert_eq!(*lock.try_read(1).expect("read current version"), "one");
block_on(lock.commit(&1));
assert_eq!(*lock.try_read_exclusive(2).expect("new value"), "one");
lock.rollback(&2);
{
let mut guard = lock.try_write(3).expect("write lock");
*guard = "three";
}
lock.finalize(&2);
assert_eq!(lock.try_read(0).unwrap_err(), Error::Outdated);
assert_eq!(*lock.try_read(3).expect("current value"), "three");