2010-09-02 133 views
0

我不太确定为什么以下控制台应用程序不会为last_insert_id()产生预期的行为。我读过last_insert_id()返回特定连接的最后一个auto_incremented值,但在此代码中,两个连接都返回相同的结果。有人能解释我出错的地方吗?MySql的并发问题Last_Insert_Id()...(C#)

static void Main(string[] args) 
    { 
     string ConnectionString = "server=XXXX;database=XXXX;username=XXXX;password=XXXX;pooling=true;max pool size=100;min pool size=0"; 

     MySqlConnection conn1 = new MySqlConnection(ConnectionString); 
     MySqlConnection conn2 = new MySqlConnection(ConnectionString); 

     MySqlCommand command1 = new MySqlCommand(); 
     MySqlCommand command2 = new MySqlCommand(); 

     command1.Connection = conn1; 
     command2.Connection = conn1; 

     StringBuilder createTableCommandText = new StringBuilder(); 
     createTableCommandText.Append("Create Table TestTable ("); 
     createTableCommandText.Append("Id INT NOT NULL AUTO_INCREMENT, "); 
     createTableCommandText.Append("str VARCHAR(20) NOT NULL, "); 
     createTableCommandText.Append("PRIMARY KEY (Id));"); 

     StringBuilder insertCommandText = new StringBuilder(); 
     insertCommandText.Append("INSERT INTO TestTable (str) VALUES ('what is the dilleo?');"); 

     StringBuilder getLastInsertId = new StringBuilder(); 
     getLastInsertId.Append("SELECT LAST_INSERT_ID();"); 

     conn1.Open(); 
     conn2.Open(); 

     command1.CommandText = createTableCommandText.ToString(); 
     command1.ExecuteNonQuery(); 

     command1.CommandText = insertCommandText.ToString(); 
     command2.CommandText = insertCommandText.ToString(); 

     command1.ExecuteNonQuery(); 
     command2.ExecuteNonQuery(); 

     command1.CommandText = getLastInsertId.ToString(); 
     Console.WriteLine("Command 1: {0}", command1.ExecuteScalar().ToString()); 
     command2.CommandText = getLastInsertId.ToString(); 
     Console.WriteLine("Command 2: {0}", command2.ExecuteScalar().ToString()); 

     conn1.Close(); 
     conn2.Close(); 

     Console.ReadLine(); 
    } 

我知道,这是不会发生,因为在顶部的连接字符串中的池,因为我想没有字符串的一部分运行的程序,我还是得到了相同的结果(即两个命令1和Command 2为last_insert_id()显示相同的值)。任何想法都欢迎!

非常感谢,

安德鲁

+0

自动提交?您可能会两次获得相同的ID,因为这两个事务都没有提交。 – 2010-09-02 01:04:44

+0

感谢您的回应,安德鲁。我没有意识到这一点,但显然默认情况下自动提交。 Guffa发现了我的错误,但我将考虑将来关闭自动确认功能。 – Andrew 2010-09-02 01:25:15

回答

2

看吧:

command1.Connection = conn1; 
command2.Connection = conn1; 

您正在使用这两个命令相同的连接。

+0

啊,我问过一些荒谬的问题,但这可能是靠近榜单的顶部。感谢您的帮助,这绝对是问题! – Andrew 2010-09-02 01:23:32