Wrapping even just selects around a transaction absolutely matters,
depending if you care about isolation.
Consider the following two clients running on the same mysql instance, w/
--transaction_isolation=serializable. Suppose we have the following innodb
table:
CREATE TABLE FOO (i INTEGER, j INTEGER);
Client 1:
SELECT * FROM foo WHERE i = 0;
SELECT * FROM foo WHERE i = 0;
Client 2:
UPDATE foo SET j = 1 WHERE i = 0;
Suppose the table starts out with a single tuple (0, 0). Now, if client 1
and client 2 are running at the same time, wrapping client 1's select
statements with a BEGIN/COMMIT removes the possibility of the following
interleaving:
C1: SELECT * FROM foo WHERE i = 0;
C2: UPDATE foo SET j = 1 WHERE i = 0;
C1: SELECT * FROM foo WHERE i = 0;
Without the BEGIN/COMMIT, the interleaving above is completely valid. Now
to answer your questions.
> On 09.04.2012, at 11:38, Rozeboom, Kay [DAS] wrote:
> >
> >> We have an application with blocks of code that begin with setting
> autocommit off, and end with a commit. The code in between does only
> selects, no updating.
> >>
> >> 1) Am I correct in thinking that the autocommit and commit
> statements don't really accomplish anything useful?
>
No, you need to reason about whether or not the select statements need to
run in isolation for correctness (like the above example).
> >> 2) If the autocommit and commit statements are unneeded, do they
> add enough additional overhead that I should be concerned about them?
>
I don't think you gain any overhead by using explicit transactions. For
instance, a single select statement (I believe) is really equivalent to
BEGIN; SELECT ...; COMMIT;
However, you do incur overhead in the sense that the longer your
transaction block is, the more time you spend holding (read) locks, and
thus excluding writers.
Hope that helps,
--
Stephen Tu