Laden...

MySql > auto_increment

Erstellt von Savage vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.754 Views
S
Savage Themenstarter:in
100 Beiträge seit 2004
vor 16 Jahren
MySql > auto_increment

verwendetes Datenbanksystem: MySql / Connector/NET

Hallo,
mein PK in der Tabelle ist ein „auto_increment“ Integer.
Wir frage ich nun nach einem Insert, am besten die automatisch erzeuge ID ab?
Nach dem Insert ein „SELECT @@IDENTITY“? Ist das sicher (Multithreading)? Performant?

Gelöschter Account
vor 16 Jahren

@@IDENTITY kann unter umständen zu problemen führen da es eine globale variable ist, die bei jeder anweisung, die der server bekommt, beeinflusst wird. wird also z.b. direkt nach deinem insert, noch ein anderer command eines anderen programmes z.b. verarbeitet, dann bekommst du einen von dir nicht gewünsten wert.

eine möglichkeit es sicher zu machen sind stored procedures, eine andere ist eine transactionscope. ob und wie das funktioniert weiß ich nicht. das sind nur die ideen die mir so spontan einfallen um das sicher hinbekommen zu können.

E
395 Beiträge seit 2007
vor 16 Jahren

warum nicht einfach ein "SELECT IDfeld FROM tabel ORDER BY IDfeld DESC /oder doch ASC bin gerade in feierabendmodus/ LIMIT 1;1"

MfG Paul

Gelöschter Account
vor 16 Jahren

weil du das problem haben kannst das du einen insert machst und bevor du es schaffst ein select zu machen ein anderes programm einen weiteren insert gemacht hat.

edit: außerdem musst du das order zeugs nicht machen wenn das ding auf autoincrement ist, da ein einfacher select max(idfeld) from tabelle ausreichen würde

F
10.010 Beiträge seit 2004
vor 16 Jahren

Select @@Identity bezieht die letzte identity einer Connection.

Und da du ja ganz bestimmt die connection nicht falsch benutzt, ist die dann schon eindeutig.

Gelöschter Account
vor 16 Jahren

kommt darauf an, wenn man z.b. einen server hat, das über diverse threads sich vom connectionpool logische connections holt, dann gibt es auch nur eine physische connection und in dem fall kann es zu unerwarteten laufzeitfehlern kommen

3.971 Beiträge seit 2006
vor 16 Jahren

Was ist mit


SELECT LAST_INSERT_ID();

? Ist das das selbe/gleiche wie @@IDENTITY?

Es gibt 3 Arten von Menschen, die die bis 3 zählen können und die, die es nicht können...

S
Savage Themenstarter:in
100 Beiträge seit 2004
vor 16 Jahren

@FZelle
ich benutze so die connection, kann es da zu problemen kommen?


using (MySqlConnection cn = new MySqlConnection(Utils.GetConnString()))
        {            
            cn.Open();            
            MySqlCommand cmd = new MySqlCommand("INSERT INTO users (usr_Loginname) VALUES (?s1)", cn);            
            cmd.Parameters.AddWithValue("?s1", "asdf");            
            cmd.Prepare();
            cmd.ExecuteNonQuery();
        }

es muss doch dafür eine gängige lösung geben oder? ich meine, das braucht man ja oft bei web-anwendungen. wenn ich z.b. einen benutzer anlege und gleich ein paar rollen in einer anderen tabelle einfügen muss, dann benötige ich ja gleich die letzte id.

oder soll man gleich ne GUID im code erzeugen und so arbeiten statt auto-increment?

F
10.010 Beiträge seit 2004
vor 16 Jahren

@JAck30lena:
Aber eine in benutzung befindliche connection wird nicht von anderen benutzt.

@Savage:
Prepare brauchst du nicht, und genau in dem using machst du als nächstes
das SELECT LAST_INSERT_ID();
Denn danach ist die connection ja schon wieder geschlossen.

S
Savage Themenstarter:in
100 Beiträge seit 2004
vor 16 Jahren

danke für die infos, werde es dann mal so umsetzten.

Gelöschter Account
vor 16 Jahren

@JAck30lena:
Aber eine in benutzung befindliche connection wird nicht von anderen benutzt.

soweit ich das kenne ist genau das nicht der fall. genau das macht ja auch connectionpooling aus....

S
Savage Themenstarter:in
100 Beiträge seit 2004
vor 16 Jahren

also ich habs jetzt mal probiert.

funktioniert ohne probleme wenn mehrere threads gleichzeitig auf die funktion zugreifen (es bekommt jeder die richtige id).

kompakt dargestellt:


using (MySqlConnection cn = new MySqlConnection(connStr))
{
  cn.Open();
  MySqlCommand cmd = new MySqlCommand("INSERT INTO tab01 (uname) VALUES (?s1);SELECT LAST_INSERT_ID();", cn);
  cmd.Parameters.AddWithValue("?s1", "asdf");
  int LastID = Convert.ToInt32(cmd.ExecuteScalar());
  Response.Write(LastID);
} 

F
10.010 Beiträge seit 2004
vor 16 Jahren

@JAck30lena:
Nein, das ist nicht richtig.
Es werden nur nicht "geöffnete" Connections ( connectionstate == closed)
aus dem pool weiterverwendet.
Und in den pool gehen sie erst wieder nach dem close.