Avatar billede jensen2005 Nybegynder
10. november 2008 - 17:15 Der er 5 kommentarer og
1 løsning

Transaction og flere bruger på samtidig

Hej eksperter
Jeg har et spørgsmål angående transaction og flere bruger på samtidig.

Beskrivelse:

Jeg har en tabel i en database.

I denne tabel er der en kolonne som hedder rækkefølge(rekkefolge).

Hvis jeg f.eks. sletter et række i tabellen opdateres rækkefølge-feltet i næsten flere andre rækker i tabellen. F.eks. Hvis nu der er 100 rækker og brugeren sletter række 3 så skal der opdateres 96 rækker.

Under denne opdatering(af de 96 rækker) bruger jeg transaction.comit/transaction.rollback.

Spørgsmål:

Hvad nu hvis en bruger i under denne opdatering sletter en af de 96 rækker – går det så ikke galt. Er det nok at bruge transaction?

Venlig hilsen
Jensen2005
Avatar billede jensen2005 Nybegynder
10. november 2008 - 17:16 #1
Spørgsmål:

Hvad nu hvis en anden bruger i under denne opdatering sletter en af de 96 rækker – går det så ikke galt. Er det nok at bruge transaction?
Avatar billede arne_v Ekspert
10. november 2008 - 17:24 #2
Det er praecis den slags som transactions beskytter mod.

Med et passende hoejt transaction isolation level vil der ikke vaere et problem.
Avatar billede arne_v Ekspert
10. november 2008 - 17:27 #3
Nu viser du ikke kode, men udfra den beskrivelse vil jeg gaette paa at Repeatable Read er hoejt nok.
Avatar billede jensen2005 Nybegynder
10. november 2008 - 18:08 #4
Jeg er først lige begyndt at bruge transactions.

Men ud fra det du siger med Repeatable Read så lyder det ikke til at det jeg har kodet er godt nok. Hvis f.eks. det er sidste række man sletter så sletter man bare uden transactions.

Der er en del if/else

Her er koden(Spaghettikoden):

kategori kat = new kategori();
                object m;
                SqlConnection Con = new SqlConnection(dbstring);
                Con.Open();
                string cmdstring = "SELECT TOP 1 * FROM kategori WHERE horertil_overkategori ='" + GridView1.DataKeys[e.RowIndex].Values[0].ToString() + "'";
                SqlCommand myCommand = new SqlCommand(cmdstring, Con);
               

                    //hovedmenu



                if (GridView1.DataKeys[e.RowIndex].Values[1].ToString() == "" || GridView1.DataKeys[e.RowIndex].Values[1].ToString()==null)
            {

               

                m = myCommand.ExecuteScalar();

                if (m != null)
                {
                    alarmen alarm = new alarmen();
                    alarm.besked("Hovedkategori kan ikke slettes, da der er en underkategori tilknyttet.");
                    Con.Close();
                }
                else
                {

                    myCommand.CommandText = "SELECT COUNT(nogle) FROM kategori WHERE horertil_overkategori IS NULL";

                 
                    string antalmenupunkter = Convert.ToString((int)myCommand.ExecuteScalar());




                    if (Convert.ToInt32(antalmenupunkter) == (Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Values[2].ToString()) + 1) )
                    {
                       
                        myCommand.CommandText = "DELETE FROM kategori WHERE nogle='" + GridView1.DataKeys[e.RowIndex].Values[0].ToString() + "'";
                        myCommand.ExecuteNonQuery();
                       
                        GridView1.DataSource = kat.kategori_dantabel();
                        GridView1.DataBind();
                    }


                    else {
                       


                        SqlTransaction tn;

                        SqlConnection Con2 = new SqlConnection(dbstring);
                        Con2.Open();
                        tn = Con2.BeginTransaction();
                        string cmdstring2 = "DELETE FROM kategori WHERE rekkefolge=" + GridView1.DataKeys[e.RowIndex].Values[2].ToString() + "";
                        SqlCommand myCommand2 = new SqlCommand(cmdstring2, Con2, tn);


                        try
                        {
                            myCommand2.ExecuteNonQuery();

                            int i = (Convert.ToInt32(antalmenupunkter)-1);
                            int start = (Convert.ToInt32(GridView1.DataKeys[e.RowIndex].Values[2].ToString()));

                           

                            for (int x = start; x < i; x++)
                            {

                                myCommand2.CommandText = "UPDATE kategori SET rekkefolge=@rekkefolge WHERE rekkefolge='" + (x + 1).ToString() + "'";
                                myCommand2.Parameters.Add(new SqlParameter("@rekkefolge", SqlDbType.VarChar, 50));
                                myCommand2.Parameters["@rekkefolge"].Value = Convert.ToString(x);
                                myCommand2.ExecuteNonQuery();
                                myCommand2.Parameters.Clear();
                            }

                            tn.Commit();

                            GridView1.EditIndex = -1;
                            GridView1.DataSource = kat.kategori_dantabel();
                            GridView1.DataBind();
                        }
                        catch
                        {
                            tn.Rollback();

                        }
                        finally
                        {

                            Con2.Close();
                            Con2.Dispose();
                            myCommand2.Dispose();
                            tn.Dispose();


                        }

                   
                    }


                }



            }
            else {

               
                myCommand.CommandText = "IF EXISTS (SELECT TOP 1 * FROM kunstner WHERE kategori='" + GridView1.DataKeys[e.RowIndex].Values[0].ToString() + "') select 'Der er bruger' ELSE DELETE FROM kategori WHERE nogle='" + GridView1.DataKeys[e.RowIndex].Values[0].ToString() + "'";

                m = myCommand.ExecuteScalar();

                if (m != null)
                {
                    alarmen alarm = new alarmen();
                    alarm.besked("Kategori kan ikke slettes da der er en kunstner tilknyttet.");
                    Con.Close();
                }
           
            }


              Con.Close();
              Con.Dispose();
              myCommand.Dispose();


           
            GridView1.DataSource = kat.kategori_dantabel();
            GridView1.DataBind();
Avatar billede jensen2005 Nybegynder
12. november 2008 - 18:02 #5
Hej arne_v

Tak for input.

Jeg googlede "transaction isolation level" og har kunne læse mig frem til at jeg skal bruge isolation level "SERIALIZABLE" hvilke hverken giver bruger udenfor trancaction'en indsætte eller opdatere. 

Tak for input - kast et svar ind - så du kan få dine point...



..myConnection.BeginTransaction(IsolationLevel.SERIALIZABLE);...
Avatar billede arne_v Ekspert
13. november 2008 - 02:07 #6
ok
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