Delen via


Gelijktijdigheidsbeheer

Gelijktijdigheid is de mogelijkheid van twee transacties om dezelfde gegevens tegelijkertijd te gebruiken, en met verhoogde transactie-isolatie neemt de gelijktijdigheid meestal af. Dit komt doordat transactieisolatie meestal wordt geïmplementeerd door rijen te vergrendelen en naarmate meer rijen zijn vergrendeld, kunnen er minder transacties worden voltooid zonder ten minste tijdelijk door een vergrendelde rij te worden geblokkeerd. Hoewel verminderde gelijktijdigheid algemeen wordt geaccepteerd als een afweging voor de hogere transactieisolatieniveaus die nodig zijn om de databaseintegriteit te behouden, kan het een probleem worden in interactieve toepassingen met een hoge lees-/schrijfactiviteit die cursors gebruikt.

Stel dat een toepassing de SQL-instructie SELECT * FROM Orders uitvoert. SqlFetchScroll wordt aanroepen om door de resultatenset te schuiven en stelt de gebruiker in staat om orders bij te werken, te verwijderen of in te voegen. Nadat de gebruiker een bestelling heeft bijgewerkt, verwijderd of ingevoegd, voert de toepassing de transactie door.

Als het isolatieniveau Repeatable Read is, kan de transactie, afhankelijk van hoe deze wordt geïmplementeerd, elke rij vergrendelen die door SQLFetchScroll wordt teruggegeven. Als het isolatieniveau Serializeerbaar is, kan de transactie de hele tabel Orders vergrendelen. In beide gevallen geeft de transactie zijn vergrendelingen alleen vrij wanneer deze wordt doorgevoerd of teruggedraaid. Dus als de gebruiker veel tijd besteedt aan het lezen van orders en zeer weinig tijd aan het bijwerken, verwijderen of invoegen ervan, kan de transactie eenvoudig een groot aantal rijen vergrendelen, waardoor ze niet beschikbaar zijn voor andere gebruikers.

Dit is zelfs een probleem als de cursor op alleen-lezen is ingesteld en de toepassing het mogelijk maakt dat de gebruiker alleen bestaande bestellingen mag lezen. In dit geval voert de toepassing de transactie door en worden de vergrendelingen vrijgegeven wanneer SQLCloseCursor (in de modus voor automatisch doorvoeren) of SQLEndTran (in de modus handmatig doorvoeren) wordt aangeroepen.

Deze sectie bevat de volgende onderwerpen.