DBM ::深:问题与交易
我从来没有做过交易(在编程方面),所以我不知道是否有什么问题我的脚本或别的东西:DBM ::深:问题与交易
#!/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;
抱歉这么长时间来回答这个问题 - 我只是在几天前才发现它。 (我DBM ::深的维护者。)
的问题是,num_txns
创建文件时只设置。 (这是因为DBM文件排列的方式在磁盘上。)一旦你创建了一个DBM文件,则num_txns
值从文件中读取,并在呼叫忽略到new()
。所以,一旦你改变了你的调用指定num_txns
,它不会帮助,除非你也使用了全新的DBM文件。
尽管我无法在不明显改变DBM文件结构的工作原理的情况下改变这种行为(这可能是一个好主意,但这是一件很重要的事情),您应该被警告并且应该有更好的文档。我已打开https://github.com/robkinyon/dbm-deep/issues/12来跟踪此问题及其修复(es)。
Accoring到documentation的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;
我想你的建议,但我再次得到了同样的错误消息。 – 2011-02-26 19:28:57
你对foo.db有适当的权限吗?尝试一个不同的文件名或在不同的目录 – 2011-02-26 20:05:41
也,在调用'新'尝试改变行到'我$ db = DBM :: Deep->新(文件=>'foo.db',num_txns => 1);''num_txns'设置在1和255之间 – 2011-02-26 20:08:56
另外,我必须为交易的HEAD + 1设置num_txns为2(或更高) - 1(如文档中所述)。 – 2015-06-19 06:31:40