[PATCH] transaction support for dbd_mysql

The following patch adds transaction support to dbd_mysql, e.g.

require ‘dbi’
db = DBI.connect(‘dbi:mysql:test’,‘foo’)
db[‘AutoCommit’] = false
db.execute(‘create table foo(bar varchar(200)) type=innodb’) rescue nil

db.transaction do
p db.select_one(‘select count() from foo’)
db.execute(‘insert into foo values (?)’,‘hello’)
p db.select_one('select count(
) from foo’)
raise “hell” # does an automatic rollback
end

It was rather too simple to implement, so I’m not sure if I’m missing
something fundamental here. I’d appreciate feedback from any other mysql
users.

I didn’t implement the read accessor, e.g. “puts db[‘AutoCommit’]”, because
I can’t find a way to ask mysql to show the current AutoCommit state, and I
don’t believe that keeping a parallel instance variable is a good idea.

I had a quick look at how the pg driver implements transactions. It uses an
instance variable “@in_transaction”, but this does not appear to be
necessary in mysql, as you don’t need to issue an explicit ‘BEGIN’.

I did notice one odd thing in the pg driver:

        if attr =~ /^pg_/ or attr != /_/
                             ^^^^^^^^^^^

I think that should be “attr !~ /_/” otherwise I can’t see how it does
anything useful.

Regards,

Brian.

ruby-dbi-all-mysql.patch (905 Bytes)

The following patch adds transaction support to dbd_mysql, e.g.

require ‘dbi’
db = DBI.connect(‘dbi:mysql:test’,‘foo’)
db[‘AutoCommit’] = false
db.execute(‘create table foo(bar varchar(200)) type=innodb’) rescue nil

db.transaction do
p db.select_one(‘select count() from foo’)
db.execute(‘insert into foo values (?)’,‘hello’)
p db.select_one('select count(
) from foo’)
raise “hell” # does an automatic rollback
end

It was rather too simple to implement, so I’m not sure if I’m missing
something fundamental here. I’d appreciate feedback from any other mysql
users.

Transaction support was added a few weeks ago. It’s not available
in a release yet, but you can get it by getting the CVS distribution.
You might want to have a look and see how it compares to your own
changes. Comments welcome.

BTW, a better list for this kind of thing is:

Ruby-dbi-devel mailing list
Ruby-dbi-devel@lists.sourceforge.net
ruby-dbi-devel List Signup and Options

I didn’t implement the read accessor, e.g. “puts db[‘AutoCommit’]”, because
I can’t find a way to ask mysql to show the current AutoCommit state, and I
don’t believe that keeping a parallel instance variable is a good idea.

I had a quick look at how the pg driver implements transactions. It uses an
instance variable “@in_transaction”, but this does not appear to be
necessary in mysql, as you don’t need to issue an explicit ‘BEGIN’.

I did notice one odd thing in the pg driver:

        if attr =~ /^pg_/ or attr != /_/
                             ^^^^^^^^^^^

I think that should be “attr !~ /_/” otherwise I can’t see how it does
anything useful.

Might be a good idea to ask this on the Ruby DBI list.

···

At 20:02 +0900 3/27/03, Brian Candler wrote:
At 10:26 +0100 3/11/03, Michael Neumann wrote:

Regards,

Brian.

Attachment converted: onyx3:ruby-dbi-all-mysql.patch (TEXT/R*ch) (00035E00)