[Dbix-class] ROLLBACK seems to be skipped on 0.08

Louis Erickson lerickson at rdwarf.net
Fri Nov 2 04:46:00 GMT 2007


On Thu, 1 Nov 2007, Brandon Black wrote:

> On 11/1/07, Louis Erickson <lerickson at rdwarf.net> wrote:
> > I do have a question regarding txn_do, though, for I don't understand how
> > it can work properly with AutoCommit => 1.
<snip>
> > How does txn_do solve this?  This is the part I don't understand.  Perhaps
> > one of the experts here can explain it.

<snip>

> All of that aside, anyone who talks about "AutoCommit => 0" being a
> required for properly supporting multi-statement transactions with
> whatever appropriate level of transaction isolation is supported by
> the underlying DBMS is on the wrong track.
> 
> You can have the same multi-statement transactions with the same
> guarantees of serialization with or without AutoCommit at the DBI
> level.  At the DBI levels and below, all the way to your database,
> there is no difference between:
> 
> $dbh->{AutoCommit} = 0;
> $dbh->do("INSERT ...");
> $dbh->do("DELETE ...");
> $dbh->commit;
> 
> and:
> 
> $dbh->{AutoCommit} = 1;
> $dbh->begin_work;
> $dbh->do("INSERT ...");
> $dbh->do("DELETE ...");
> $dbh->commit;

Ah-ha!  There is a big thing in there that I didn't know about!  That 
little "begin_work" method is new to me, and serves a really important 
purpose here.  Using that makes real transactions possible, even with 
AutoCommit on.

A critical thing that I'd completely missed.  It's been in DBI since 2001, 
and I had never managed to run in to it before.

> However, for the abstractions DBIC is trying to support, AutoCommit=>1
> is really the only way to go.  AutoCommit=>0 would either require us
> to require all sql-generating code be in explicitly marked txns
> (marked by a begin_work-like call), which would suck for lots of
> existing modules out there, or if we didn't do so, would require us to
> somehow magically deal with ambiguously nested transaction contexts.
> AutoCommit=>1 doesn't suffer from these issues.

Sure, that makes sense.  The inability to do the more complex, multi-step 
transactions seemed like a glaring problem, and I was actually pretty sure 
that folks of the caliber I've seen around here wouldn't have missed it, 
but I didn't see the solution.

The explanations of why AutoCommit=>0 isn't going to mix well with DBIC 
were already pretty well hashed out, actually.  The only hole seemed to be 
multi-step transactions, and that is possible.  DBIC handles it, and I can 
make it happen on my own.  With that in place, I don't see any reason to 
struggle with AutoCommit=>0 compatibility either.

> As far as the DBIC-level txn api goes, "txn_do($coderef, at args)"
> basically does something like the following pseudocode from the user
> perspective:
<snip>
> However, nobody's come up with any sane example of
> anything they'd want to do with those calls that can't be accomplished
> via txn_do(), which saves you working out all the gory details
> yourself and probably handles things better.

I'd figured most of that out from the code.  I was all over it, debugging 
the transaction depths and figuring out what was going on, trying to make 
sure I wasn't doing something silly before I posted.  Either I missed the 
begin_work call, or it was in a helper function and I didn't realize it 
was a native DBI call.

The only other reason I'm using AutoCommit=>0 is some other non-DBIC code, 
but I can either open a separate DB connection for that, or use begin_work 
myself in it.  Or re-write it with DBIC, finally.  I'll probably do the 
latter, and then quit worrying about it.  (Or the separate connection, as 
that's very simple, and then a re-write next.)

Thank you *very* much for the clear reply!  It completely answered my 
question and resolves any concern I may have had.

-- 
Louis Erickson - lerickson at rdwarf.net - http://www.rdwarf.com/~wwonko/

It was one of those perfect summer days -- the sun was shining, a
breeze was blowing, the birds were singing, and the lawn mower was
broken ...
		-- James Dent



More information about the DBIx-Class mailing list