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)。

+0

另外,我必须为交易的HEAD + 1设置num_txns为2(或更高) - 1(如文档中所述)。 – 2015-06-19 06:31:40

Accoring到documentationrollback命令结束事务。

回滚()该丢弃的变化 事务中所做的 主线和结束交易。

因此,你需要一个回滚之后重新开始一个新的事务。

$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; 
+0

我想你的建议,但我再次得到了同样的错误消息。 – 2011-02-26 19:28:57

+0

你对foo.db有适当的权限吗?尝试一个不同的文件名或在不同的目录 – 2011-02-26 20:05:41

+0

也,在调用'新'尝试改变行到'我$ db = DBM :: Deep->新(文件=>'foo.db',num_txns => 1);''num_txns'设置在1和255之间 – 2011-02-26 20:08:56