MySQL doesn't guarantee that there will be no gaps in sequence values.
 Assigment of the id is always atomic because innodb uses an AUTO_INC
lock that lasts for the time of the insert, not the life of the
transaction.

lets say your highest order number is 10

transaction begins for client 1
  insert into orders (...) values (...)
  mysql_insert_id = 11 
  ... user adds stuff to order ...
  aborts order, transaction rolls back

at the same time
transaction begins for client 2
  insert into orders (...) values (...)
  mysql_insert_id = 12
  ... adds some stuff ...
  commits order

there will be a row with an id of 10 and a row with an id of 12 in
your database..  id 11 was rolled back and is gone

this is all documented here:
http://dev.mysql.com/doc/mysql/en/InnoDB_auto-increment_column.html

--- Scott Haneda <[EMAIL PROTECTED]> wrote:
> I have been pulling my hair out trying to get a
> solution to something,
> assuming idiotically that in a transaction scenario
> I would not be able to
> get the insert it back out.  It seems to work, I am
> wondering how and if it
> is reliable.
> 
> Give the scenario where I have 2 inserts I want to
> make, since I can not
> seem to figure out how to make 2 inserts in one
> statement, I will make 2,
> with the condition that the second one needs to know
> the insert id.
> 
> I just don't see how mysql can know the insert id in
> a transaction
> situation, I am assumeing that mysql does not
> actually insert anything at
> all untill it sees the COMMIT, so how does it know
> the insert id at all, the
> records have not been inserted yet?  Is this
> reliable?
> 
> Here is some pseudo code that shows what I am doing
> and commetns where I am
> confused:
> 
> mysqlQuery(tConn, "START TRANSACTION");
> 
> repeat 1000 times  
>     mysqlQuery(tConn, "INSERT into zaddress
>                        SET user_id = '123',
>                        address =
> '[EMAIL PROTECTED]'");
>     
>     // How can mysql know about this ???? !!!!
>     tID = mysqlInsertID(tConn);
>     
>     mysqlQuery(tConn, "INSERT INTO zblacklist
>                        SET user_id = '123',
>                        id = " & tID & ", address = "
> & tID);
> end repeat;
> 
> mysqlQuery(tConn, "COMMIT");
> -- 
> -------------------------------------------------------------
> Scott Haneda                                Tel:
> 415.898.2602
> http://www.newgeo.com                       Fax:
> 313.557.5052
> [EMAIL PROTECTED]                            Novato,
> CA U.S.A.
> 
> 
> 
> -- 
> MySQL General Mailing List
> For list archives: http://lists.mysql.com/mysql
> To unsubscribe:   
> http://lists.mysql.com/[EMAIL PROTECTED]
> 
>

-- 
MySQL General Mailing List
For list archives: http://lists.mysql.com/mysql
To unsubscribe:    http://lists.mysql.com/[EMAIL PROTECTED]

Reply via email to