26. november 2008 - 14:17Der 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.
Med kunstig intelligens skaber HP’s nye OmniBook X 14 en unik og skræddersyet brugeroplevelse målrettet dem, der ønsker høj ydeevne og intelligente funktioner
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?
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)
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?
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
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.
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.
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?
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?
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.
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.