<div dir="ltr"><div><div>Hello.<br></div>Is there right way to work with AnyEvent::DBI and transactions?<br>#!/usr/bin/perl<br><br>use common::sense;<br>use AnyEvent;<br>use AnyEvent::DBI;<br><br>sub db_init {<br>  my %opts  = (@_);<br>
  my $dbh   = delete $opts{'dbh'};<br><br>  undef $$dbh;<br>  $$dbh = new AnyEvent::DBI<br>    $opts{'c'},<br>    "",<br>    "",<br>    PrintError  =>  0,<br>    AutoCommit  =>  1,<br>
    on_error    =>  sub {<br>      my $fatal = pop;<br><br>      chomp $@;<br>      print STDERR '[', AE::time, '|', $opts{'c'}, ']: ', $@, "\n";<br>      $fatal and db_init(dbh => $dbh, c => $opts{'c'});<br>
    }<br>  ;<br>}<br><br>my $cv = AE::cv;<br>my $dbh; db_init(dbh => \$dbh, c => 'DBI:SQLite:dbname=_c.db');<br><br>foreach my $n (1 .. 10 * 10) {<br>  if ($n % 10 == 0) {<br><br>    my $commit = AE::cv {<br>
      $dbh->commit(sub {<br>         $#_ ? $cv->end : $dbh->rollback(sub { $cv->end; });<br>      });<br>    };<br><br>    $dbh->begin_work(sub {<br>      my ($dbh, $rc) = @_;<br><br>      $#_ or return;<br>
      $cv->begin;<br><br>      foreach (1 .. 10) {<br>        $commit->begin;<br>        $dbh->exec(<br>          "INSERT INTO data(rand) VALUES(abs(random()))",<br>          sub { $commit->end; }<br>
        );<br>      }<br>    });<br>  }<br>}<br><br>$cv->recv;<br>undef $_ foreach ($dbh); <br><br></div>I receive an error "Already in a transaction" in 2 .. 10 iterations of cycle(even if I do some hard work at begin of the cycle before each transaction).<br>
</div>