List:General Discussion« Previous MessageNext Message »
From:David Griffiths Date:September 1 2005 4:33pm
Subject:Re: Weird delete behavior on mysql 4.0 - rows not disappearing....
View as plain text  
I believe you - I'm just a but surprised. I guess I had a singular view 
of how a session should work based on Oracle. I would have expected that 
until you execute SQL that requires a commit or a rollback, you wouldn't 
be in a transaction. Unfortunately, if you have connections that are 
read and write, and one connection ends up being used for SELECTs only 
(just bad luck) , it's going to have an out-date view of the database.

To me, a transaction is something you commit or rollback. You can't 
commit or rollback a SELECT unless you've done a locking-read. I guess 
Oracle is just smarter about it, only starting a transaction behind the 
scenes if you've actually done something that warrants a transaction.

David



Michael Stassen wrote:

> David Griffiths wrote:
>
>>
>> "No, with the default transaction isolation level, REPEATABLE READ, 
>> that's how it is supposed to work. You've started a transaction in 
>> Window B, so Window B is immune to changes made in Window A until you 
>> finish the transaction in Window B. See the manual for details
>> http://dev.mysql.com/doc/mysql/en/innodb-consistent-read.html"
>>
>> I haven't explicitly started any transactions in Window B - it's 
>> select-only (with autocommit set to 0). Are you saying that even though
>> transactions have happend and been committed in Window A, I won't be 
>> able
>> to see those transactions in Window B?
>
>
> The key word is "explicitly".  You have implicitly started a 
> transaction with your first SELECT, precisely because you turned 
> AUTOCOMMIT off.  That transaction continues until you COMMIT or 
> ROLLBACK (or perform an action that implicitly commits 
> <http://dev.mysql.com/doc/mysql/en/innodb-implicit-command-or-rollback.html>).
> 
>  That's the point of setting AUTOCOMMIT to off.  If you only want to 
> start transactions explicitly (with START TRANSACTION or BEGIN), then 
> you need to leave AUTOCOMMIT on.  See the manual for details 
> <http://dev.mysql.com/doc/mysql/en/innodb-and-autocommit.html>.
>
>> The relevant part of the documentation in the link you sent is,
>>
>> "The query see[s] the changes made by exactly those transactions that 
>> committed before that point of time, and no changes made by later or
>> uncommitted transactions. The exception to this rule is that the query
>> sees the changes made by the transaction itself that issues the 
>> query." >
>> In otherwords, if you start a query (and it's a long running query), 
>> you won't see the results of any data committed by another session 
>> during the
>> running of that query. Fine. That's expected.
>>
>> But if I am doing only queries (no transactions) via a connection, 
>> and no
>> query is running when I commit data in another session, then the
>> query-window should see the results of those changes.
>
>
> From the AUTOCOMMIT manual page cited above, "In InnoDB, all user 
> activity occurs inside a transaction."
>
>> I suspect that the mysql client is implicitly starting a transaction 
>> when
>> you do a "set autocommit=0". Thus, any changes made by any other 
>> sessions
>> won't be visible till you do a commit or rollback. Each time a commit 
>> or rollback is issued in the non-auto-commit session, you can see 
>> data changed by other sessions.
>
>
> With AUTOCOMMIT off, the transaction starts, in your case, with your 
> first SELECT.
>
>> Regardless, this is not a repeatable-read issue. I think it's a mysql 
>> client issue, and the fact that the client is creating transactions for
>> you in the background.
>
>
> It's not the client.  That's how InnoDB works.
>
>> This is not how the Oracle client works - you are always in 
>> non-auto-commit mode (and I'd love to figure out how to set that -
>> autocommit is so dangerous), and until you actually start a transaction
>> with an update, insert, delete or select-for-update, no transaction is
>> started, and you can see the changes made by other sessions once they've
>> been committed (I tested SQL*Plus on Oracle 8i to make sure). >
>
>
> I'll make no comments on how Oracle works, but what you seem to be 
> describing is effectively what happens with AUTOCOMMIT on in MySQL.  
> In general, I'd suggest that expecting any two RDBMSs (MySQL and 
> Oracle, for example) to behave in exactly the same way will usually 
> get you in trouble.
>
>> David
>
>
> Michael
>

Thread
Weird delete behavior on mysql 4.0 - rows not disappearing....David Griffiths1 Sep
  • Re: Weird delete behavior on mysql 4.0 - rows not disappearing....Michael Stassen1 Sep
    • Re: Weird delete behavior on mysql 4.0 - rows not disappearing....Jason Martin1 Sep
Re: Weird delete behavior on mysql 4.0 - rows not disappearing....David Griffiths1 Sep
  • Re: Weird delete behavior on mysql 4.0 - rows not disappearing....Michael Stassen1 Sep
    • Re: Weird delete behavior on mysql 4.0 - rows not disappearing....David Griffiths1 Sep
      • Re: Weird delete behavior on mysql 4.0 - rows not disappearing....SGreen1 Sep
        • Re: Weird delete behavior on mysql 4.0 - rows not disappearing....David Griffiths1 Sep