Avatar billede john123 Nybegynder
29. juli 2005 - 11:48 Der er 7 kommentarer

nested transactions i c#

Dav
Jeg har designet en database, der kører på en MS sql platform. Denne Database bliver så kaldt fra dot net, ved hjælp af SQlHelper klassen. Det jeg gerne vil er at lave en nested transaction. I min C# kode bliver der først kørt en transaction der laver fire kald til databasen. Disse fire kald er inkapslet i en transaction. Mit problem er at et af disse fire kald, indehoder to kald der også er inkapslet i en transaction, og når jeg kører mit program for jeg fejlen "SqlConnection does not support parallel transactions".

Min kode, simplificeret ser ud som følger:


Client klassen i business layer:

public bool Save()

BeginTransaction();

//kalder en update i dataacces layer der så kalder databasen
DAL.UpdateCLient(parametre);

DAL.UpdateCustomer(parametre);

//denne metode kalder så adresse klassens save metode
//Adresse klasen ligger også i bussiness layer og dens
//save metode
Adresse.save();

CommitTransaction();

return true;

Adresse klassens save metode(Adresse.Save())
indeholder så følgende

bool Save

//kalder DataAcces layer
BeginTransaction();

DAL.AdresseUpdate(parametre);

DAL.PostnummerUpdate(paraetre);

CommitTransaction();

Dette vil sige at jeg alder BeginTransaction, og før denne bliver commitet kalder jeg en begintransaction igen.
hvilket, som sagt, giver mig fejlen: SqlConnection does not support parallel transactions.

Er der nogen der kan hjælpe???

Mvh
Kalle
Avatar billede arne_v Ekspert
29. juli 2005 - 22:29 #1
Skal du ikke bare bruge 2 forskellige SqlConnection's til de 2 transaktioner ?
Avatar billede arne_v Ekspert
29. juli 2005 - 22:30 #2
Om det er nemt med SqlHelper ved jeg ikke, men ellers må du droppe den og bruge
SqlConnection's direkte.
Avatar billede arne_v Ekspert
03. september 2005 - 18:45 #3
OK ?
Avatar billede tuxic Nybegynder
22. oktober 2005 - 20:30 #4
Hvad er ideen med at have nestede transaktioner? Hvorfor er 1 ikke nok? Er tanken at hvis den inderste transaktion abortes skal den ydre også abortes?

Som en side-note burde der måske være noget try finally
Avatar billede arne_v Ekspert
22. oktober 2005 - 20:40 #5
typisk scenarie:

begin tx1
insert attempt
begin tx2
do something
if success {
  commit tx2
  update attempt status=ok
  commit tx1
} else {
  rollback tx2
  update attempt status=error
  commit tx1
}

jeg aner ikke om det er spørgers problem stilling
Avatar billede tuxic Nybegynder
23. oktober 2005 - 00:29 #6
er det virkeligt et typisk scenarie? (ikke ment spydigt)
Da tx1 commites uanset success virker det (på mig) som en unødig kompleksitet at neste dem. Hvorfor ikke starte med tx2 og så bagefter lave tx1?
Avatar billede arne_v Ekspert
23. oktober 2005 - 22:46 #7
ikke et typisk scenarie generelt

men nok et typisk scenarie når man nester transaktioner

der er 2 mulige grunde til at lave det sådan:

1)  rent praktisk hvis koden er fordelt ud så noget kode laver tx1 og kalder
    noget andet kode som er pænt encapsulated d.v.s. at det første kode får
    kun en bool tilbage og ved ikke engang at der har været en tx2 og at den
    er committed eller rollbacked

2)  det er vigtigt at minimere risikoen for at have en tx2 uden en tx1 i databasen
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