首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DBM::Deep:事务的问题

DBM::Deep:事务的问题
EN

Stack Overflow用户
提问于 2011-02-26 17:46:34
回答 2查看 424关注 0票数 2

我从来没有做过事务(在编程方面),因此我不知道我的脚本是否有问题或其他什么:

代码语言:javascript
复制
#!/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;

输出:

代码语言:javascript
复制
# Does support transactions
# DBM::Deep: Cannot allocate transaction ID at ./perl1.pl line 12

评论的一部分:

代码语言:javascript
复制
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;
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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来跟踪这个问题和对它的修复。

票数 1
EN

Stack Overflow用户

发布于 2011-02-27 00:19:36

根据documentationrollback命令结束事务。

rollback()该函数丢弃事务内对主线所做的更改,并结束事务。

因此,您需要在回滚之后启动一个新事务。

代码语言:javascript
复制
$db->{key} = 'value';
$db->begin_work;
$db->{key1} = 'value2';
$db->rollback;
$db->begin_work;
$db->{key1} = 'value1';
$db->commit;

或者你可以这样做

代码语言:javascript
复制
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;

或者使用一点黑魔法,你可以保持面向对象的风格

代码语言:javascript
复制
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;
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5126182

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档