В соответствии с документацией команда rollback
завершает транзакцию.
rollback () Отменяет сделанные в транзакции изменения в основной линии и завершает транзакцию.
Поэтому вам нужно начать новую транзакцию после отката.
$db->{key} = 'value';
$db->begin_work;
$db->{key1} = 'value2';
$db->rollback;
$db->begin_work;
$db->{key1} = 'value1';
$db->commit;
или вы можете сделать что-то вроде
sub my_rollback {
my $db = shift;
$db->rollback();
$db->begin_work();
}
$db->{key} = 'value';
$db->begin_work;
$db->{key1} = 'value2';
my_rollback $db;
$db->{key1} = 'value1';
$db->commit;
или немного черногомагия, вы можете сохранить стиль OO
sub my_rollback {
my $db = shift;
$db->rollback();
$db->begin_work();
};
{
no strict 'refs';
*{'DBM::Deep::my_rollback'} = \&my_rollback;
}
$db->{key} = 'value';
$db->begin_work;
$db->{key1} = 'value2';
$db->my_rollback;
$db->{key1} = 'value1';
$db->commit;