2010-09-02 135 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