我从来没有做过事务(在编程方面),因此我不知道我的脚本是否有问题或其他什么:
#!/usr/bin/env perl
use warnings;
use 5.012;
use DBM::Deep;
my $db = DBM::Deep->new( 'foo.db' );
my $trans = $db->supports( 'transactions' );
say 'Does ', $trans ? '' : 'NOT ', 'support transactions';
$db->{key} = 'value';
$db->begin_work;
$db->{key1} = 'value2';
$db->rollback;
$db->{key1} = 'value1';
$db->commit;输出:
# Does support transactions
# DBM::Deep: Cannot allocate transaction ID at ./perl1.pl line 12评论的一部分:
my $db = DBM::Deep->new( file => 'my.db', num_txns => 1 );
$db->{key} = 'value';
$db->begin_work;
$db->{key1} = 'value2';
$db->rollback;
$db->begin_work;
$db->{key1} = 'value1';
$db->commit;发布于 2015-06-16 00:35:59
很抱歉花了这么长时间来回答这个问题--我几天前才找到这个问题。(我是DBM::Deep的维护者。)
问题是只有在创建文件时才设置num_txns。(这是因为DBM文件在磁盘上的布局方式。)一旦创建了一个DBM文件,就会从文件中读取num_txns值,并在调用new()时忽略该值。因此,一旦更改了调用以指定num_txns,除非您还使用了一个新的DBM文件,否则这是没有用的。
虽然我无法在不显著更改DBM文件结构工作方式的情况下更改此行为(这可能是一个好主意,但这是一件很重要的事情),但您应该得到警告,并且应该有更好的文档。我已经打开了https://github.com/robkinyon/dbm-deep/issues/12来跟踪这个问题和对它的修复。
发布于 2011-02-27 00:19:36
根据documentation,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;或者使用一点黑魔法,你可以保持面向对象的风格
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;https://stackoverflow.com/questions/5126182
复制相似问题