Skip to main content

OptimisticWriteTx

Struct OptimisticWriteTx 

Source
pub struct OptimisticWriteTx { /* private fields */ }
Expand description

A cross-keyspace transaction using optimistic concurrency control

Use WriteTransaction::commit to commit changes to the keyspace(s).

Transactions keep a consistent view of the database at the time, meaning old data will not be dropped until it is not referenced by any active transaction.

For that reason, you should try to keep transactions short-lived, and make sure they are not held somewhere forever.

§Caution

The transaction may fail and have to be rerun if it conflicts.

Implementations§

Source§

impl WriteTransaction

Source

pub fn durability(self, mode: Option<PersistMode>) -> Self

Sets the durability level.

Source

pub fn take<K: Into<UserKey>>( &mut self, keyspace: impl AsRef<Keyspace>, key: K, ) -> Result<Option<UserValue>>

Removes an item and returns its value if it existed.

tree.insert("a", "abc")?;

let mut tx = db.write_tx()?;

let taken = tx.take(&tree, "a")?.unwrap();
assert_eq!(b"abc", &*taken);
tx.commit()?;

let item = tree.get("a")?;
assert!(item.is_none());
§Errors

Will return Err if an IO error occurs.

Source

pub fn update_fetch<K: Into<UserKey>, F: FnOnce(Option<&UserValue>) -> Option<UserValue>>( &mut self, keyspace: impl AsRef<Keyspace>, key: K, f: F, ) -> Result<Option<UserValue>>

Atomically updates an item and returns the new value.

Returning None removes the item if it existed before.

§Examples
tree.insert("a", "abc")?;

let mut tx = db.write_tx()?;

let updated = tx.update_fetch(&tree, "a", |_| Some(Slice::from(*b"def")))?.unwrap();
assert_eq!(b"def", &*updated);
tx.commit()?;

let item = tree.get("a")?;
assert_eq!(Some("def".as_bytes().into()), item);
tree.insert("a", "abc")?;

let mut tx = db.write_tx()?;

let updated = tx.update_fetch(&tree, "a", |_| None)?;
assert!(updated.is_none());
tx.commit()?;

let item = tree.get("a")?;
assert!(item.is_none());
§Errors

Will return Err if an IO error occurs.

Source

pub fn fetch_update<K: Into<UserKey>, F: FnOnce(Option<&UserValue>) -> Option<UserValue>>( &mut self, keyspace: impl AsRef<Keyspace>, key: K, f: F, ) -> Result<Option<UserValue>>

Atomically updates an item and returns the previous value.

Returning None removes the item if it existed before.

§Examples
tree.insert("a", "abc")?;

let mut tx = db.write_tx()?;

let prev = tx.fetch_update(&tree, "a", |_| Some(Slice::from(*b"def")))?.unwrap();
assert_eq!(b"abc", &*prev);
tx.commit()?;

let item = tree.get("a")?;
assert_eq!(Some("def".as_bytes().into()), item);
tree.insert("a", "abc")?;

let mut tx = db.write_tx()?;

let prev = tx.fetch_update(&tree, "a", |_| None)?.unwrap();
assert_eq!(b"abc", &*prev);
tx.commit()?;

let item = tree.get("a")?;
assert!(item.is_none());
§Errors

Will return Err if an IO error occurs.

Source

pub fn insert<K: Into<UserKey>, V: Into<UserValue>>( &mut self, keyspace: impl AsRef<Keyspace>, key: K, value: V, )

Inserts a key-value pair into the keyspace.

Keys may be up to 65536 bytes long, values up to 2^32 bytes. Shorter keys and values result in better performance.

If the key already exists, the item will be overwritten.

§Examples
tree.insert("a", "previous_value")?;
assert_eq!(b"previous_value", &*tree.get("a")?.unwrap());

let mut tx = db.write_tx()?;
tx.insert(&tree, "a", "new_value");

drop(tx);

// Write was not committed
assert_eq!(b"previous_value", &*tree.get("a")?.unwrap());
Source

pub fn remove<K: Into<UserKey>>( &mut self, keyspace: impl AsRef<Keyspace>, key: K, )

Removes an item from the keyspace.

The key may be up to 65536 bytes long. Shorter keys result in better performance.

§Examples
tree.insert("a", "previous_value")?;
assert_eq!(b"previous_value", &*tree.get("a")?.unwrap());

let mut tx = db.write_tx()?;
tx.remove(&tree, "a");

// Read-your-own-write
let item = tx.get(&tree, "a")?;
assert_eq!(None, item);

drop(tx);

// Deletion was not committed
assert_eq!(b"previous_value", &*tree.get("a")?.unwrap());
Source

pub fn commit(self) -> Result<Result<(), Conflict>>

Commits the transaction.

§Errors

Will return Err if an IO error occurs.

Source

pub fn rollback(self)

More explicit alternative to dropping the transaction to roll it back.

Trait Implementations§

Source§

impl Readable for WriteTransaction

Source§

fn get<K: AsRef<[u8]>>( &self, keyspace: impl AsRef<Keyspace>, key: K, ) -> Result<Option<UserValue>>

Retrieves an item from the snapshot. Read more
Source§

fn contains_key<K: AsRef<[u8]>>( &self, keyspace: impl AsRef<Keyspace>, key: K, ) -> Result<bool>

Returns true if the snapshot contains the specified key. Read more
Source§

fn first_key_value(&self, keyspace: impl AsRef<Keyspace>) -> Option<Guard>

Returns the first key-value pair in the snapshot. The key in this pair is the minimum key in the snapshot. Read more
Source§

fn last_key_value(&self, keyspace: impl AsRef<Keyspace>) -> Option<Guard>

Returns the last key-value pair in the snapshot. The key in this pair is the maximum key in the snapshot. Read more
Source§

fn size_of<K: AsRef<[u8]>>( &self, keyspace: impl AsRef<Keyspace>, key: K, ) -> Result<Option<u32>>

Retrieves the size of an item from the snapshot. Read more
Source§

fn iter(&self, keyspace: impl AsRef<Keyspace>) -> Iter

Iterates over the snapshot. Read more
Source§

fn range<K: AsRef<[u8]>, R: RangeBounds<K>>( &self, keyspace: impl AsRef<Keyspace>, range: R, ) -> Iter

Iterates over a range of the snapshot. Read more
Source§

fn prefix<K: AsRef<[u8]>>( &self, keyspace: impl AsRef<Keyspace>, prefix: K, ) -> Iter

Iterates over a prefixed set of the snapshot. Read more
Source§

fn is_empty(&self, keyspace: impl AsRef<Keyspace>) -> Result<bool>

Returns true if the parkeyspacetition is empty. Read more
Source§

fn len(&self, keyspace: impl AsRef<Keyspace>) -> Result<usize>

Scans the entire keyspace, returning the number of items. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.