Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Cost of opening and closing an empty transaction

4 views
Skip to first unread message

Jon Leighton

unread,
Sep 21, 2012, 6:46:58 AM9/21/12
to
Hello!

I'm one of the developers of the Ruby on Rails web framework.

In some situations, the framework generates an empty transaction block.
I.e. we sent a BEGIN and then later a COMMIT, with no other queries in
the middle.

We currently can't avoid doing this, because a user *may* send queries
inside the transaction.

I am considering the possibility of making the transaction lazy. So we
would delay sending the BEGIN until we have the first query ready to go.
If that query never comes then neither BEGIN nor COMMIT would ever be sent.

So my question is: is this a worthwhile optimisation to make? In
particular, I am wondering whether empty transactions increase the work
the database has to do when there are several other connections open?
I.e. does it cause contention?

If anyone has any insight about other database servers that would also
be welcome.

Thanks!

Jon Leighton

--
http://jonathanleighton.com/


--
Sent via pgsql-performance mailing list (pgsql-pe...@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-performance

Claudio Freire

unread,
Sep 21, 2012, 11:08:15 PM9/21/12
to
On Fri, Sep 21, 2012 at 7:46 AM, Jon Leighton <j...@jonathanleighton.com> wrote:
> So my question is: is this a worthwhile optimisation to make? In
> particular, I am wondering whether empty transactions increase the work
> the database has to do when there are several other connections open?
> I.e. does it cause contention?

I found myself on a similar situation, with a different framework
(SQLAlchemy), and it turned out to be worthwhile, mainly because
regardless of the load generated on the database, which may or may not
be of consequence to a particular application, the very significant
saving of at least 4 roundtrips (send begin, receive ack, send commit,
receive ack) can be worth the effort.

In particular, my application had many and very likely such cases
where no query would be issued (because of caching), and we were able
to reduce overall latency from 20ms to 1ms. Presumably, the high
latencies were due to busy links since it was all on a private (but
very busy) network.

Now, from the point of view of what resources would this idle
transaction consume on the server, you will at least consume a
connection (and hold a worker process idle for no reason). If you want
high concurrency, you don't want to take a connection from the
connection pool unless you're going to use it, because you'll be
blocking other clients.

Albe Laurenz

unread,
Sep 24, 2012, 5:48:23 AM9/24/12
to
Jon Leighton wrote:
> I'm one of the developers of the Ruby on Rails web framework.
>
> In some situations, the framework generates an empty transaction
block.
> I.e. we sent a BEGIN and then later a COMMIT, with no other queries in
> the middle.
>
> We currently can't avoid doing this, because a user *may* send queries
> inside the transaction.
>
> I am considering the possibility of making the transaction lazy. So we
> would delay sending the BEGIN until we have the first query ready to
go.
> If that query never comes then neither BEGIN nor COMMIT would ever be
sent.
>
> So my question is: is this a worthwhile optimisation to make? In
> particular, I am wondering whether empty transactions increase the
work
> the database has to do when there are several other connections open?
> I.e. does it cause contention?
>
> If anyone has any insight about other database servers that would also
> be welcome.

The one thing that will be the same for all databases is that
saving the two client-server roud trips for BEGIN and COMMIT
is probably worth the effort if it happens often enough.

The question which resources an empty transaction consumes
is probably database specific; for PostgreSQL the expense is
not high, as far as I can tell.

Yours,
Laurenz Albe
0 new messages