SQL Server 2005 - beheren concurrency op tafels

stemmen
1

Ik heb in een ASP.NET-toepassing dit proces kreeg:

  • Start een verbinding
  • Start een transactie
  • Invoegen in een tabel loadData veel waarden met de klas SqlBulkCopy met een kolom die een specifieke LoadId bevat.
  • Oproepen een opgeslagen procedure die:
    • lees de tabel loadData voor het specifieke LoadId.
    • Voor elke lijn doet veel berekeningen die impliceert het lezen van tientallen tafels en schrijf de resultaten in een tijdelijke (#temp) tabel (proces dat enkele minuten duren).
    • Verwijdert de lijnen in LoadDate voor het specifieke LoadId.
    • Zodra alles is gedaan, schrijf het resultaat in het resultaat tabel.
  • Commit transactie of terugdraaien als er iets mislukt.

Mijn probleem is dat als ik 2 gebruikers die het proces te starten, zal de tweede moeten wachten dat de vorige klaar is (omdat de insert lijkt een exclusieve vergrendeling op de tafel) en mijn aanvraag valt soms in time-out (en de gebruikers zijn niet blij om te wachten :)).

Ik ben op zoek naar een manier om te kunnen de gebruikers die alles doet in parallel, omdat er geen interactie hebben, behalve de laatste: het schrijven van het resultaat. Ik denk dat wat is het blokkeren van mij is de inserts / verwijdert in de loadData table. Ik controleerde de andere transactie isolatie niveaus, maar het lijkt erop dat niets me kon helpen.

Wat zou perfect zou zijn om in staat zijn om de exclusieve slot op de loadData table te verwijderen (is het mogelijk om SqlServer dwingen om alleen te vergrendelen rijen en niet die tafel?) Wanneer de invoeg-klaar is, maar zonder het beëindigen van de transactie.

Enige suggestie?

De vraag is gesteld op 09/12/2008 om 14:38
bron van user
In andere talen...                            


3 antwoorden

stemmen
1

als je zeker weet dat er geen probleem met cioncurrent operaties, behalve het laatste deel, waarom dan niet de transactie te starten net voor die laatste verklaringen, afhankelijk van wat ze zijn, dat vereisen isolatie), en plegen onmiddellijk nadat ze slagen .. Dan zullen alle upfront lees operaties zullen elkaar niet blokkeren ...

antwoordde op 09/12/2008 om 15:24
bron van user

stemmen
1

Kijk omhoog SET TRANSACTIE isolatieniveau Read Committed SNAPSHOT in Books Online.

antwoordde op 09/12/2008 om 15:04
bron van user

stemmen
1

Transacties moet betrekking hebben op kleine en snel uitvoeren van stukjes SQL / code. Ze hebben de neiging om anders op verschillende platforms worden geïmplementeerd. Ze wordt vergrendeld tafels en vouw het slot als de wijzigingen groeien dus het vergrendelen van de andere gebruikers van het bevragen of het updaten van dezelfde rij / page / table.

Waarom niet te vergeten de transactie, en het handvat verwerkingsfouten op een andere manier? Is uw data-integriteit echt wordt beveiligd door de transactie, of kunt u ook zonder?

antwoordde op 09/12/2008 om 14:43
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more