in reply to Poor man's transaction construct
use Sub::ScopeFinalizer qw( scope_finalizer ); { my @undo; my $guard = scope_finalizer { for (reverse(@undo)) { eval { $_->(); 1 } or warn($@); } }; $dbh->do("CREATE DATABASE foo"); push @undo, sub { $dbh->do("DROP DATABASE foo"); }; mkdir("/path/foo") or die(...); push @undo, sub { rmdir "/path/foo" }; ... @undo = (); # Or $guard->disable(); }
The outer curlies could be an eval, a loop or just bare curlies; it's not relevant. It the block is exited via die, last, etc, the rollback will occur.
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re^2: Poor man's transaction construct
by dgaramond2 (Monk) on Nov 24, 2010 at 12:21 UTC | |
by aquarium (Curate) on Nov 24, 2010 at 22:01 UTC | |
by ikegami (Patriarch) on Nov 24, 2010 at 16:34 UTC |