2011-02-26 156 views
2

我從來沒有做過交易(在編程方面),所以我不知道是否有什麼問題我的腳本或別的東西: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; 

回答

1

抱歉這麼長時間來回答這個問題 - 我只是在幾天前才發現它。 (我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

1

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