Tjena allesamman! Du verkar ju ha klurat ut det hela själv. För att få bra skalbarhet i en flerskiktad COM-lösning gäller det att göra små snabba jobb. Tack för din syn på saken Johan! :-) Om du inte hade behövt kunna göra rollback på alltihop så hade du kunnat köra utan transaktion i COM+ och bara ha transaktioner i SP'na. Då får du bara låsning på de tabeller som ingår i den SP som körs för tillfället. Ennan annan sak som kanske kan hjälpa mot prestandaproblemen. Om du har metoder som bara läser och inte gör någon insert,update eller delete så lägg dem i en egen klass. Se till att du kör notransactions på den klassen. Det sparar ganska mycket vid instansieringen.Om transaktionshantering i VB
Nån som har bra koll och erfarenhet av transaktionshantering (MTS, COM+) i VB?
Jag har SQL-server7 på en server och skriver klientklasser i VB med transaktions-stöd.
Problemet är att jag får så dålig prestanda. Systemet är ett fleranvändarsystem men det är inte särskilt effektivt och så lyckas jag få deadlocks... haha.. skitbra.
Sen är en transaktion väldigt lång, alltså.. jag kör väldigt mkt kod och anropar många SP’s på servern innan jag kör objcontext.setcomplete. Det verkar inte vara en bra praxis enligt sidor på nätet. Databastabeller blir låsta för länge vilket förhindrar parallellaccess till dem.
Vem som helst som pillat med såna här saker förr får gärna höra av sig.. så kan vi komma in på mer detaljer ... å kanske lösa det så det blir snabbt å bra :-)
mvh,
JohanSv: Om transaktionshantering i VB
Min erfarenhet är att sådant som användarna gör under dagen som behöver en transaktion oftast går att uföra ganska fort. Det brukar vara en simpel insert eller update. Sedan kan man göra stora uppdateringar schemalagt under natten.
De stora körningar som användarna måste göra på dagen är oftast läsningar för rapportuttag som ju inte behöver någon transaktion, och i de flesta fall behöver man inte ens läslås på de inblandade tabellerna.
Behöver du verkligen köra alla SP's i samma transaktion, om det räcker med en transaktion per SP så kortar du ner låsningetiderna på respektive objekt.
/johan/Sv: Om transaktionshantering i VB
Då har jag lite nya funderingar.
Så här ser mina klasser ut idag (starkt förenklat)
Ett obj av klass 1 skapas och anropas från ASP.
Klass 1 (public) - requiresTransaction.
Skapar objekt av klass 2 och anropar div. funktioner i det.
Kör slutligen objcontext.commit eller
objcontext.setabort om fel uppstått någonstans.
Klass 2 (private) - requiresTransaction. Anropar div SP's
Skapar objekt av klass 3 och klass 4 samt anropar div funktioner i
de båda.
Klass 3 (private) - requiresTransaction. Anropar div SP's
Klass 4 (private) - requiresTransaction. Anropar div SP's.
Uppdelningen i klasser har med problemområdet att göra.
Alla klasser impl. objcontext och jag använder mig av setabort / setcomplete för att köra rollback resp commit av databasändringarna när kontrollen nått obj av klass 1 igen.
Min situation är sådan att alla anrop till typ 10 st SP's måste lyckas, annars måste jag köra rollback. Därför har jag en enda transaktion fast jag skulle gärna ändra på det om du har en idé om hur jag kunde hantera det annorlunda.
Du sa: "Behöver du verkligen köra alla SP's i samma transaktion, om det räcker med en transaktion per SP så kortar du ner låsningetiderna på respektive objekt."
Hur löser man ett sådan sak? Hur skapar man en transaktion per SP? Det har jag inte koll på.
Kan jag dela upp mina anrop på något sätt och commit:a flera gånger och ändå ha mijölighet att köra rollback? (som om det var en enda transaktion)
Du får gärna belysa saken ytterligare för det känns som jag behöver mer tips.
Mvh,
JohanSv: Om transaktionshantering i VB
Om användaren inte behöver få feedback omedelbart skulle du kunna posta till en messageque och hantera den när det inte är så många som använder systemet.
Kan du dela upp det i 2 databaser; en som du skriver i och en som du läser från så kan du replikera den du skriver till en gång i timmen eller så.
Är databasen vettigt normaliserad? Det kan annars var en källa till att man måste skriva på många ställen i onödan.
/johan/Sv: Om transaktionshantering i VB
Sen finns det en ful sak som du kan använda dig av för att slippa låsningar, men då måste du ha tungan i rätt mun och det är att använda "Locking Hints", alltså att ange t.ex.
FROM customers WITH (NOLOCK)
Kolla mer i msdn under NOLOCK.
Slutligen; den kod som anropar ditt transaktionsobjekt måste sätta sin instans till nothing direkt efter anropet. Jag har märkt att låsningar släpper inte vid setcomplete utan först när objektet sätts till nothing.
Lycka till
/Martin