Avatar billede speedpete Nybegynder
26. november 2008 - 14:17 Der er 28 kommentarer og
1 løsning

System.Transactions i BLL

Jeg sidder og kigger lidt på System.Transactions, fordi jeg gerne, af overskuelighedshensyn, vil flytte mine transaktioner op fra DAL til BLL (Jeg kører iøvrigt på en MySQL, men det burde vel ikke gøre fra eller til?).

Spørgsmålet er: Kan jeg gøre således i BLL:

public void UdførToKaldTilDAL()
{
start transaktion
DAL.HentNogleOplysninger() // Kalder metode i DAL, som åbner en db-forbindelse, læser, og lukker forbindelsen
DAL.OpdaterNogleOplysninger() // Kalder metode i DAL, som åbner en db-forbindelse, læser, og lukker forbindelsen
slut transaktion
}

Det, jeg er bekymret for er spørgsmålet om concurrency og isolationlevel: Jeg vil tilgå to funktioner i DAL, som hver især gør noget ved databasen, og hvor der gerne ikke skulle komme forstyrrende opdateringer andetstedsfra imellem disse to operationer.
Avatar billede arne_v Ekspert
26. november 2008 - 14:59 #1
TransactionScope klassen eksisterer for at loese dette problem.
Avatar billede speedpete Nybegynder
26. november 2008 - 15:03 #2
tak, for det, så er jeg lidt mere på sporet. Du har tilfældigvis ikke et link til en novice-tutorial med noget simpel eksempelkode?
Avatar billede arne_v Ekspert
26. november 2008 - 15:05 #4
Det er faktisk forbloeffende nemt at bruge !
Avatar billede speedpete Nybegynder
26. november 2008 - 19:02 #5
ok, nu har jeg så kigget på dine links - har et par spørgsmål:
Hvad er "the ambient transaction"?
Skal man sørge for at alle ens metodekald gør brug af TransactionScope for at de ikke "smutter uden om" dem som gør, og kan forårsage ulykker?
Avatar billede arne_v Ekspert
26. november 2008 - 19:11 #7
Hele pointen er at de ting du laver bliver automatisk indrulleret i transaktionen
uden at du skal goere noget.
Avatar billede arne_v Ekspert
26. november 2008 - 19:16 #8
Der er ioevrigt 2 ting du skal checke for MySQL:
1) at du bruger InnoDB tabeller (MyISAM tabeller understoetter ikke transaktioner)
2) at du bruger nyeste connector version (5.0.0 understoetter TransactionScope,
  5.0.2 understoetter distributed, 5.1.6 og 5.2.1 fixede et problem med
  transaction isolation level - viste en hurtig googling)
Avatar billede speedpete Nybegynder
26. november 2008 - 19:26 #9
Tak for det med MySQL - det var mit næste investigations-projekt.

Mht ambient: "Ambient transactions are defined as transactions that live in the current thread or object context that anybody interested can query for their existence and use them to do work as part of them" (http://blogs.msdn.com/florinlazar/archive/2005/04/19/409570.aspx)

dvs enten eksisterer der en transaktion i forvejen, eller også gør der ikke, og lige meget hvad, så er der ikke noget problem? Eller?
Avatar billede arne_v Ekspert
26. november 2008 - 21:10 #10
Du styrer selv det.

Der er en constructor som tager en http://msdn.microsoft.com/en-us/library/system.transactions.transactionscopeoption.aspx
som argument.
Avatar billede speedpete Nybegynder
27. november 2008 - 08:31 #11
Ok, så må jeg se om min webhotel(!)-udbyder, surftown, er opdateret mht MySQL-connector. Smid et svar, hvis du vil have pts'ne.
Avatar billede speedpete Nybegynder
27. november 2008 - 09:14 #12
! Jeg har ikke rigtig styr på det med conectors... Der findes en 3.51, men det er vist ODBC... Dem du nævner, er det .NET-connectors?
Avatar billede arne_v Ekspert
27. november 2008 - 15:05 #13
Ja - det er MySQL Connector for .NET !

Og hvis dit web hotel ikke har den så smider du bare DLL filen op i dit bin dir.
Avatar billede speedpete Nybegynder
27. november 2008 - 16:01 #14
Ok, så fik jeg den installeret hos mig selv. Iøvrigt så har surftown kun version 4.1 af selve MySQL DBMSen... er det et problem? (De reklamerer med 5.0...!)

Jeg har bare fået en MySql.Data.dll i min bin, er det alt? Og så kan jeg bruge "using MySql.Data;"

Men hvad så, jeg kan vel ikke bare ændre min forbindelseskonstant

private static string connection = "Driver={MySQL ODBC 3.51 Driver};Server=localhost;Port=3306;Option=3;Database=mydb;uid=adm;Pwd=123;";       

som jeg har brugt til at lave OdbCConnections?

        public static DataTable Getsomething()
        {
            OdbcConnection conn = new OdbcConnection(connection);
            OdbcCommand command = new OdbcCommand("SELECT * FROM table1", conn);
            OdbcDataAdapter adapter = null;
            DataTable dt = new DataTable();
            try
            {
                conn.Open();
                adapter = new OdbcDataAdapter(command);
                adapter.Fill(dt);
            }
            catch (Exception e)
            {                throw e;            }
            finally
            {
                try { conn.Close(); }
                catch (Exception) { }
            }
            return dt;
        }
Avatar billede arne_v Ekspert
27. november 2008 - 16:22 #15
"Data Source=localhost;Database=mydb;User Id=xxx;Password=xxx"
Avatar billede arne_v Ekspert
27. november 2008 - 16:23 #16
Giver de mulighed for InnoDB tabeller ?

Ellers er alle dine overvejelser om transaktioner ret spildte !
Avatar billede speedpete Nybegynder
27. november 2008 - 18:58 #17
??? Spørgsmål ikke forstået...

Hvorfor bliver du i tvivl om "Data Source=localhost;Database=mydb;User Id=xxx;Password=xxx" i fht. InnoDb ?
Avatar billede arne_v Ekspert
27. november 2008 - 19:27 #18
Spørgsmålet relaterer sig ikke til connection string men til om web hoteller er
så god at de tilbyder InnoDB tabeller når de hænger på så gammel en MySQL version.
Avatar billede speedpete Nybegynder
27. november 2008 - 20:27 #19
ok, det må jeg så lige undersøge... men jeg fik lov til at eksekvere SQL-scriptet til at oprette InnoDB-tabeller (om det så rent faktisk er sket, ved jeg ikke)

Noget helt andet er, at jeg googler mig til en masse folk, som indtil for få dage siden poster på diverse forums om problemer med TransactionScope i MySQL, så måske hænger der stadig en bug i connector5.2.
Avatar billede speedpete Nybegynder
27. november 2008 - 20:30 #20
Nu forstod jeg den med "Data Source=localhost;Database=mydb;User Id=xxx;Password=xxx"
Du mener at jeg ikke burde fortælle hele verden det, hvis jeg bruger adm/123 som autentifikation?
Avatar billede arne_v Ekspert
27. november 2008 - 20:36 #21
Du kan spørger om hvilken type tabellen faktisk er.

----

Sikkert. Men kast dig ud i det og se hvordan det går.

----

Det er formatet for connection string. Og ja password skal helst posts her som xxx.
Avatar billede speedpete Nybegynder
28. november 2008 - 09:40 #22
Kan du hjælpe mig med en sidste ting:

The type or namespace name 'TransactionScope' could not be found (are you missing a using directive or an assembly reference?)

using System.TransactionScope; i toppen af min side hjælper ikke?
Avatar billede speedpete Nybegynder
28. november 2008 - 10:14 #23
arrgh... det hjalp jo så at tilføje en reference...
Avatar billede speedpete Nybegynder
28. november 2008 - 13:37 #24
Ok, det ser ud til at det virker (begrænset) på mine egne lokale maskiner:

using (TransactionScope scope = new TransactionScope())
{
Membership.CreateUser("testerfredag", "1234", "aasd@adfdf.dk"); //(1)
SDWebVandDAL.DALstatic.Insert( "1", "stor");//(1)
SDWebVandDAL.DALstatic.Insert2( "4200", "Slagelse");//(1)
scope.Complete();
}

(1) ligger i en anden dll og med forbindelse til en anden database (men på samme server), end (2)og(3), som hver især skriver til 2 tabeller i den samme database.

Hvis (1) kaster en exception, så aborteres hele blokken.
Hvis (1) er ok, så committes den, uden hensyn til, at den er del af en transaktion, og (2) udløser følgende fejl: "Multiple simultaneous connections or connections with different connection strings inside the same transaction are not currently supported"
Hvis jeg helt udelader (1), så bliver (2) rolled back hvis (3) fejler, hvilket jo er som forventet.

Jeg ved så ikke om man skulle overveje at skifte til MS SQL Server 2005?
Avatar billede arne_v Ekspert
28. november 2008 - 16:59 #25
Jeg gætter på at MemberShip bruger TransactionScopeOption.RequiresNew - hvis det er
en MemberShip provider som du har source code til kan du checke og rette hvis du vil.
Avatar billede arne_v Ekspert
28. november 2008 - 17:00 #26
Den sidste fejl er jo MySQL connector relateret, så jeg ville prøve at google fejlen og se
om den evt. er fixet i en version som er releaset i beta.
Avatar billede speedpete Nybegynder
01. december 2008 - 08:44 #27
Ok, vil du have nogle points?
Avatar billede arne_v Ekspert
01. december 2008 - 15:56 #28
gerne
Avatar billede speedpete Nybegynder
01. december 2008 - 18:52 #29
værsgo'
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