If you are NOT in autocommit mode, your connection (or the server, it doesn't matter which) starts a transaction *when you issue your first command*. Every command you issue on that connection is in that initial transaction until you EXPLICITLY commit or rollback (or do something else that commits or rolls-back your transactions like ALTER TABLE) . At that point a new transaction is automatically started when you issue your next command. If I remember correctly, closing a connection with a pending transaction defaults to a ROLLBACK. That way if a transaction is left incomplete due to communications failure, you maintain a consistent database.
If autocommit is enabled (SET autocommit=1) then each command executes within it's own mini-transaction (one little, tight transaction wrapped around each statement). Each SELECT can see what every other INSERT, UPDATE, or DELETE has done (assuming their transactions are committed) because it is not already inside a pending transaction. This is the default mode for user interaction for nearly every database product I have used. With autocommit active, you are required to explicitly issue a START TRANSACTION if you want a transaction that includes several commands. Are you sure that's not how Oracle operates, too? I ask because MS SQL acts the same as MySQL when it comes to autocommits Shawn Green Database Administrator Unimin Corporation - Spruce Pine David Griffiths <[EMAIL PROTECTED]> wrote on 09/01/2005 12:33:55 PM: > 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 > > > > > -- > MySQL General Mailing List > For list archives: http://lists.mysql.com/mysql > To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED] >