0 Tage Serie
rust / expert
Snippet

Transaktions-Rollback-Ausführung mit benutzerdefinierten Scope-Guards

In der Systemprogrammierung ist die Gewährleistung eines Zustands-Rollbacks bei Fehlern oder Panics entscheidend. Dieser Schnipsel implementiert einen Scope-Guard mittels des `Drop`-Traits. Wenn ein Scope vorzeitig beendet wird, bevor `.commit()` aufgerufen wird, setzt der Guard den Zustand automatisch zurück.

snippet.rs
rust
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
pub struct RollbackGuard<'a, T: Clone> {
value_ref: &'a mut T,
backup: T,
dismissed: bool,
}
impl<'a, T: Clone> RollbackGuard<'a, T> {
pub fn new(value_ref: &'a mut T) -> Self {
let backup = value_ref.clone();
Self { value_ref, backup, dismissed: false }
}
pub fn commit(mut self) {
self.dismissed = true;
}
}
impl<'a, T: Clone> Drop for RollbackGuard<'a, T> {
fn drop(&mut self) {
if !self.dismissed {
*self.value_ref = self.backup.clone();
}
}
}
Erklärung
1
pub struct RollbackGuard<'a, T: Clone> {
Deklariert einen RAII-Wrapper, der eine veränderliche Referenz hält und den Originalwert sichert.
2
pub fn commit(mut self) {
Deaktiviert das Rollback, was den Erfolg der Operation signalisiert und die Änderungen persistiert.
3
fn drop(&mut self) {
Destruktor-Logik beim Verlassen des Scopes; führt die Wiederherstellung aus, falls kein Commit erfolgt ist.