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