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.