我不太確定爲什麼以下控制檯應用程序不會爲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()顯示相同的值)。任何想法都歡迎!
非常感謝,
安德魯
自動提交?您可能會兩次獲得相同的ID,因爲這兩個事務都沒有提交。 – 2010-09-02 01:04:44
感謝您的迴應,安德魯。我沒有意識到這一點,但顯然默認情況下自動提交。 Guffa發現了我的錯誤,但我將考慮將來關閉自動確認功能。 – Andrew 2010-09-02 01:25:15