pub enum LockMode {
IntentionShared,
IntentionExclusive,
Shared,
SharedIntentionExclusive,
Exclusive,
}Expand description
The mode in which a transaction holds, or wants to hold, a lock.
The five modes form a lattice ordered by privilege: holding a stronger mode
grants the capabilities of every weaker mode it covers.
Acquiring a mode while already holding another upgrades to their
join (least upper bound) — for example shared + intention
exclusive becomes SharedIntentionExclusive.
§Examples
use lock_db::LockMode;
// Two readers coexist; a writer excludes everyone.
assert!(LockMode::Shared.compatible_with(LockMode::Shared));
assert!(!LockMode::Shared.compatible_with(LockMode::Exclusive));
// Intention-shared coexists with everything except an exclusive lock.
assert!(LockMode::IntentionShared.compatible_with(LockMode::SharedIntentionExclusive));
assert!(!LockMode::IntentionShared.compatible_with(LockMode::Exclusive));Variants§
Intention shared (IS). Announces intent to take shared locks on finer resources beneath this one. Compatible with everything except exclusive.
IntentionExclusive
Intention exclusive (IX). Announces intent to take exclusive (or shared) locks on finer resources. Compatible with the intention modes only.
Shared (S). A read lock. Any number of transactions may hold a resource
Shared at once, alongside intention-shared holders.
Shared and intention exclusive (SIX). The transaction reads the whole subtree (S) and intends to write part of it (IX). Compatible only with intention-shared.
Exclusive
Exclusive (X). A write lock. Held by at most one transaction, and only when no other transaction holds the resource in any mode.
Implementations§
Source§impl LockMode
impl LockMode
Sourcepub const fn compatible_with(self, other: LockMode) -> bool
pub const fn compatible_with(self, other: LockMode) -> bool
Returns true if a lock in self mode and a lock in other mode may be
held on the same resource by two different transactions at once.
This is the symmetric compatibility relation of the standard MGL matrix:
| IS | IX | S | SIX | X | |
|---|---|---|---|---|---|
| IS | ✓ | ✓ | ✓ | ✓ | ✗ |
| IX | ✓ | ✓ | ✗ | ✗ | ✗ |
| S | ✓ | ✗ | ✓ | ✗ | ✗ |
| SIX | ✓ | ✗ | ✗ | ✗ | ✗ |
| X | ✗ | ✗ | ✗ | ✗ | ✗ |
§Examples
use lock_db::LockMode;
assert!(LockMode::IntentionShared.compatible_with(LockMode::IntentionExclusive));
assert!(!LockMode::IntentionExclusive.compatible_with(LockMode::Shared));
assert!(!LockMode::Exclusive.compatible_with(LockMode::IntentionShared));Sourcepub const fn join(self, other: LockMode) -> LockMode
pub const fn join(self, other: LockMode) -> LockMode
Returns the least mode that grants everything both self and other
grant — their least upper bound in the privilege lattice.
This is what an upgrade resolves to: a transaction already holding self
that requests other ends up holding self.join(other). For example a
reader (Shared) that announces intent to write part of the subtree
(IntentionExclusive) upgrades to SharedIntentionExclusive. join is
commutative and associative.
§Examples
use lock_db::LockMode;
assert_eq!(
LockMode::Shared.join(LockMode::IntentionExclusive),
LockMode::SharedIntentionExclusive,
);
assert_eq!(LockMode::IntentionShared.join(LockMode::Shared), LockMode::Shared);
assert_eq!(LockMode::Shared.join(LockMode::Exclusive), LockMode::Exclusive);
// join with itself is itself.
assert_eq!(LockMode::IntentionExclusive.join(LockMode::IntentionExclusive), LockMode::IntentionExclusive);Sourcepub const fn covers(self, other: LockMode) -> bool
pub const fn covers(self, other: LockMode) -> bool
Returns true if holding self already grants everything other would.
Equivalent to self.join(other) == self: self sits at or above other
in the lattice. This drives the idempotent path of acquisition — a
request for a mode you already cover is a no-op.
§Examples
use lock_db::LockMode;
assert!(LockMode::Exclusive.covers(LockMode::Shared));
assert!(LockMode::SharedIntentionExclusive.covers(LockMode::Shared));
assert!(LockMode::SharedIntentionExclusive.covers(LockMode::IntentionExclusive));
assert!(!LockMode::Shared.covers(LockMode::IntentionExclusive));Sourcepub const fn is_exclusive(self) -> bool
pub const fn is_exclusive(self) -> bool
Returns true for LockMode::Exclusive.
§Examples
use lock_db::LockMode;
assert!(LockMode::Exclusive.is_exclusive());
assert!(!LockMode::Shared.is_exclusive());Sourcepub const fn is_intention(self) -> bool
pub const fn is_intention(self) -> bool
Returns true for the intention modes (IS, IX, SIX).
Intention modes are placeholders taken on a coarse resource to signal that a finer lock will be taken beneath it; they are not themselves read or write locks on the resource’s own data.
§Examples
use lock_db::LockMode;
assert!(LockMode::IntentionShared.is_intention());
assert!(LockMode::SharedIntentionExclusive.is_intention());
assert!(!LockMode::Shared.is_intention());
assert!(!LockMode::Exclusive.is_intention());