2

私は(プログラミングの観点から)トランザクションを行ったことがないので、スクリプトまたは他の何かに問題があるかどうかわかりません。

#!/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;
4

2 に答える 2

1

ドキュメントによると、コマンドはトランザクションを終了します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;

または少し黒魔術を使えば、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-26T16:19:35.873 に答える