Avatar billede larsny Nybegynder
22. februar 2007 - 15:18 Der er 14 kommentarer og
1 løsning

c# Mysql transaction

Hej
Som der står i emnet, går spørgsmålet ud på, hvordan man laver en transaction?

jeg har noget kode der ser sådan ud:

OdbcConnection Conn = dbConnStart();

dbDataWrite("INSERT INTO table1 (navn) value('hej');", Conn);
dbDataWrite("INSERT INTO table2 (navn) value('hej2');", Conn);

Conn.Close();

Funktionen dbConnStart starter forbindelsen til databasen, og returnere den.
Funktionen dbDataWrite udføre selve sql-forespørgslen.
Koden kan ses her:

private void dbDataWrite(String sql, OdbcConnection Conn)
{
    if (sql != "")
    {
        OdbcCommand Command = new OdbcCommand(sql, Conn);
        OdbcDataReader rs = Command.ExecuteReader();
        rs.Close();
    }
}

Hvordan sikre jeg mig, at hvis forespørgsel nr 2 mislykkes, eller noget andet kode fejler så forespørgsel nr 2 ikke bliver udført, at den laver en rollback på forespørgsel nr 1?

På forhånd tal
Avatar billede kalp Novice
22. februar 2007 - 15:25 #1
if(dbDataWrite("INSERT INTO table1 (navn) value('hej');", Conn) != 0)
{
dbDataWrite("INSERT INTO table2 (navn) value('hej2');", Conn);
}


private int dbDataWrite(String sql, OdbcConnection Conn)
{
    if (sql != "")
    {
        OdbcCommand Command = new OdbcCommand(sql, Conn)
        return Command.ExecuteNonQuery();
    }
}
Avatar billede kalp Novice
22. februar 2007 - 15:28 #2
glemte lige en sidste return;)

private int dbDataWrite(String sql, OdbcConnection Conn)
{
    if (sql != "")
    {
        OdbcCommand Command = new OdbcCommand(sql, Conn)
        return Command.ExecuteNonQuery();
    }
return 0;
}
Avatar billede arne_v Ekspert
22. februar 2007 - 15:38 #3
et OdbcConnection objekt har en BeginTransaction metod esom returnerer et
OdbcTransaction objekt som har Commit og Rollback metoder

OdbcTransaction tx = con.BeginTransaction();
//udfoer 2 INSERT paa con (det er ligemeget om det er nede i metoder)
tx.Commit();
Avatar billede arne_v Ekspert
22. februar 2007 - 15:38 #4
Husk at transaktioner kun virker med InnoDB tabeller ikke med MyISAM tabeller.
Avatar billede kalp Novice
22. februar 2007 - 15:40 #5
jeg kan slet ikke forstå hvorfor han vil commit en noget når ingen ændringer bliver foretaget? hvis der ikke indsættes noget så laver man vel commit for ingenting?
Avatar billede larsny Nybegynder
22. februar 2007 - 16:02 #6
Hmm nu sidder jeg så og skal vurdere hvad der er lettest..

gawi dit eksempel er lige til og let, men vil også lige forstå arne's eksempel.

Hvad er forskellen på de to metoder?

Hvis jeg bruger arne's eksempel, kommer min kode så til at se sådan ud?:

OdbcConnection Conn = dbConnStart();
OdbcTransaction tx = Conn.BeginTransaction();

dbDataWrite("INSERT INTO table1 (navn) value('hej');", Conn);
dbDataWrite("INSERT INTO table2 (navn) value('hej2');", Conn);

tx.Commit();

Conn.Close();

og holder den så selv styr på om der sker fejl under vejs eller hvordan arne?
Avatar billede arne_v Ekspert
22. februar 2007 - 16:07 #7
mit eksempel bruger transaktioners - hans goer ikke

ja - det ser korrekt ud

naesten i tilfaelde af en exception bliver transaktionen ikke committet - det vil dog
nok vaere paenere at catche den exception og kalde Conn.Rollback() eksplicit

hvis det kan gaa galt uden at der sker en exception skal du selv teste paa retur
vaerdi, men jeg mener at en INSERT der gaarr galt giver en exception
Avatar billede larsny Nybegynder
22. februar 2007 - 16:16 #8
Perfekt

Jeg forstår ikke helt det du skriver om RollBack...

Altså vi er enige om, at er der en af forespørgslerne der går galt, så bliver tx.Commit(); ikke kørt, og database laver automatisk en RollBack...

Conn.Rollback(); bruger man så hvis man har en try-catch da koden så ikke crasher, og man skal derfor selv fortælle databasen at den skal gøre det?
Avatar billede arne_v Ekspert
22. februar 2007 - 16:20 #9
re 22/02-2007 15:40:42>

den relevante situation er hvis den foerste INSERT gaar godt men den sidste INSERT fejler
Avatar billede kalp Novice
22. februar 2007 - 16:23 #10
22/02-2007 16: >
yep.. det fandt jeg ud af ved at læse spørgsmålet igen:) ville dog ikke spamme jer med min nye opdagelse:)
Avatar billede arne_v Ekspert
22. februar 2007 - 16:25 #11
Jeg ved faktisk ikke hvad MySQL goer naar man bare ikke commiter. Jeg gaetter
paa at MySQL selv ruller tilbage ved timeout eller naar connection closes.

Jeg betragter det som paenere at fortaelle den at den skal rulle tilbage og
formentligt bliver ressourcer ogsaa frigivet hurtigere saa.

Og du skal vel under alle omstaendigheder catche den exception.
Avatar billede larsny Nybegynder
22. februar 2007 - 16:39 #12
Jeg får desværre en fejl.
System.InvalidOperationException: Execute requires the command to have a transaction object when the connection assigned to the command is in a pending local transaction. The Transaction property of the command has not been initialized.
at Microsoft.Data.Odbc.OdbcConnection.SetStateExecuting(String method, OdbcTransaction transaction)
at Microsoft.Data.Odbc.OdbcCommand.ValidateConnectionAndTransaction(String method)
at Microsoft.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method)
at Microsoft.Data.Odbc.OdbcCommand.ExecuteReader(CommandBehavior behavior)
at Microsoft.Data.Odbc.OdbcCommand.ExecuteReader()
at ASP.XX_do_aspx.dbDataWrite(String sql, OdbcConnection Conn) in XX:\XX\XX\XX.aspx:line 37
at ASP.XX_aspx.__Render__control1(HtmlTextWriter __output, Control parameterContainer) in XX:\XX\XX\XX_do.aspx:line 18


Koden ser sådan ud nu:

OdbcConnection Conn = dbConnStart();
    OdbcTransaction tx = Conn.BeginTransaction();
   
    try
    {
        dbDataWrite("Insert into table;", Conn);
       
        tx.Commit();
    }
    catch (Exception ex)
    {
        Response.Write(textToHtml(ex.ToString()));
        tx.Rollback();
    }
   
    Conn.Close();
Avatar billede arne_v Ekspert
22. februar 2007 - 17:09 #13
sorry

proev lige at faa foelgende

Command.Transaction = tx;

sneget ind et relavnt sted
Avatar billede larsny Nybegynder
22. februar 2007 - 17:37 #14
Så ser det ud til at spille :)

Tak for hjælpen...

Disse point må gå til arne :)
Avatar billede arne_v Ekspert
22. februar 2007 - 18:06 #15
saa ligger jeg et svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester