| Bug #45329 | Autoincrement within Transaction | ||
|---|---|---|---|
| Submitted: | 4 Jun 2009 11:38 | Modified: | 22 Jul 2009 9:36 |
| Reporter: | Wolfgang Ahrens | Email Updates: | |
| Status: | Not a Bug | Impact on me: | |
| Category: | Connector / NET | Severity: | S3 (Non-critical) |
| Version: | 6.03, 6.04 | OS: | Windows (XP) |
| Assigned to: | CPU Architecture: | Any | |
| Tags: | autoincrement; rollback ; transaction | ||
[4 Jun 2009 11:38]
Wolfgang Ahrens
[9 Jun 2009 15:46]
Tonci Grgin
Hi Wolfgang and thanks for your report. I would like to see full test case attached and some info on MySQL server and OS / .NET FW used.
[9 Jul 2009 23:01]
Bugs System
No feedback was provided for this bug for over a month, so it is being suspended automatically. If you are able to provide the information that was originally requested, please do so and change the status of the bug back to "Open".
[12 Jul 2009 11:02]
Wolfgang Ahrens
Server OS : MS Server2003 SQL-Server: 5.1.33 MS Visual Studio 2008 Net FW 3.5 + 2.0
[13 Jul 2009 6:27]
Tonci Grgin
Thanks Wolfgang. Now I would like to see your test case attached.
[13 Jul 2009 7:08]
Wolfgang Ahrens
'CREATE TABLE `main` (
' `Id` int(11) NOT NULL AUTO_INCREMENT,
' `Date` date NOT NULL DEFAULT '1000-01-01',
' PRIMARY KEY (`Id`)
') ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1;
'CREATE TABLE `sub` (
' `Id` int(11) NOT NULL AUTO_INCREMENT,
' `Text` text NOT NULL,
' PRIMARY KEY (`Id`)
') ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
Imports MySql.Data.MySqlClient
Module Module1
Dim sqlDBConn As MySqlConnection
Dim sqlCmd As New MySqlCommand("show tables", sqlDBConn)
Sub Main()
Dim connStr As String
Dim i0 As Integer = 0
Dim i1 As Integer = 0
connStr = String.Format("server={0};user id={1}; password={2}; database={3}; pooling=false", _
"sbosrv", "root", "weser", "test") ' change to your values
Try
sqlDBConn = New MySqlConnection(connStr)
sqlDBConn.Open()
Catch ex As MySqlException
Console.WriteLine("Server nicht erreichbar : " + ex.Message)
End Try
Dim myTrans As MySqlTransaction
myTrans = sqlDBConn.BeginTransaction
Try
sqlCmd = New MySqlCommand("insert into main values(0, '2009-01-01')", sqlDBConn)
sqlCmd.Transaction = myTrans
sqlCmd.ExecuteNonQuery()
i0 = sqlCmd.LastInsertedId
Dim _s As String = "test" & Chr(146) ' this is the error
sqlCmd.CommandText = "insert into sub values(0,'" & _s & "')"
sqlCmd.ExecuteNonQuery()
i1 = sqlCmd.LastInsertedId
myTrans.Commit()
Catch ex As Exception
myTrans.Rollback()
Console.WriteLine("Error in transaction :" & ex.ToString)
End Try
sqlCmd.Dispose()
sqlDBConn.Close()
Console.WriteLine("master =" & i0.ToString)
Console.WriteLine("sub =" & i1.ToString)
While Console.Read = 0
End While
End Sub
End Module
[13 Jul 2009 7:11]
Tonci Grgin
Thanks Wolfgang. Looking into this.
[16 Jul 2009 10:04]
Tonci Grgin
Wolfgang, this is not a bug but expected behavior that happens in every RDBMS we know. Generated values are not a part of transaction and they don't care about other statements. As AI value of 8 was generated it is expected for 8 to be returned, rollback or not. Same behavior is observed in mysql command line client: CREATE TABLE b45329_1 ( `Id` int(11) NOT NULL AUTO_INCREMENT, `Date` date NOT NULL DEFAULT '1000-01-01', PRIMARY KEY (`Id`) ) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1; mysql> select last_insert_id(); +------------------+ | last_insert_id() | +------------------+ | 0 | +------------------+ 1 row in set (0.00 sec) mysql> start transaction; Query OK, 0 rows affected (0.00 sec) mysql> select last_insert_id(); +------------------+ | last_insert_id() | +------------------+ | 0 | +------------------+ 1 row in set (0.00 sec) mysql> insert into b45329_1 values(0, '2009-01-01'); Query OK, 1 row affected (0.00 sec) mysql> select last_insert_id(); +------------------+ | last_insert_id() | +------------------+ | 8 | +------------------+ 1 row in set (0.00 sec) mysql> rollback; Query OK, 0 rows affected (0.01 sec) mysql> select last_insert_id(); +------------------+ | last_insert_id() | +------------------+ | 8 | << 8 was indeed generated +------------------+ 1 row in set (0.00 sec) mysql> select * from b45329_1; Empty set (0.00 sec) << So it is rolled back
[22 Jul 2009 7:01]
Wolfgang Ahrens
Sorry, but before i used a different connector and i never had the problem that an autoincrement value was increased when the transaction was aborted. Otherwise autoincrement can not be used for invoice numbers, etc.
[22 Jul 2009 7:08]
Tonci Grgin
Wolfgang, true. Do *not* use AI values for invoice numbers. Since invoices usually have few different types, what I did, on my previous job, was to calculate Invoice#/Type pair and leave AI Id for searches/updates. I'm curious, what have you used before? I do not know of SQL server that will work the way you want it.
[22 Jul 2009 9:36]
Wolfgang Ahrens
Hallo Tonci, the NET-Connector i used before was "MySQLDriverCS.dll". http://sourceforge.net/project/shownotes.php?release_id=256810 This connector does not produce this useless increments. Wolfgang
[23 Jul 2009 6:33]
Tonci Grgin
Wolfgang, thanks for the info but you're missing the point... >> This connector does not produce this useless increments. Even mysql cl client produces increments as that's how MySQL server works. Nothing to do with c/NET. It seems obvious to me that your old client was using some sort of client-side caching and not sending commands to server at all...
