Om iets in AutoCAD te doen dat betrekking heeft op de database (de tekening dus), is een Transaction nodig. Bijvoorbeeld voor het opvragen van de eigenschappen van een lijn, maar ook het toevoegen van een nieuwe Layer of Entity.

Een Transaction zorgt daarnaast ook voor de Undo mogelijkheden in de database. Alle wijzigingen kunnen ineens ongedaan worden gemaakt als dit in één Transaction is uitgevoerd. Als je bijvoorbeeld honderden blokken en polylijnen toevoegt aan de database, is het handig om dat binnen één Transaction uit te voeren. Elke handeling apart mag prima in een geneste Transactie worden gedaan want Transactions kunnen genest worden.

Dit laatste is handig want dan kun je een aparte functie maken voor het toevoegen van één symbool waarbij je in de functie een Transaction toepast. Door deze functie te herhalen binnen een aparte Transaction zorgt ervoor dat je alle toevoegingen ineens ongedaan kan maken. Als je dat zou willen. Maar voor een gebruiker van je applicatie is het wel handig om dit in één stap te kunnen en niet elk symbool afzonderlijk ongedaan te moeten maken.

Er zijn twee aanroepen mogelijk tot het maken van een Transaction, namelijk een StartTransaction() en een StartOpenCloseTransaction(). De laatste heeft als voordeel dat het twee keer zo snel is, maar als nadeel dat het niet genest kan worden. Daarom is de laatste al minder bruikbaar. Je weet nooit of een functie van jou binnen een andere functie aangeroepen wordt waarna je applicatie er onverhoopt mee stopt. Wil je die laatste toch gebruiken, doe dan goed onderzoek en test alles.

Best Practice

Een goed gebruik is het toepassen van een Transaction in een using. Dit zorgt ervoor dat de Transaction altijd wordt opgeruimd na gebruik, ook als je een fout krijgt. Dit is een stukje voorbeeld code:

Copy to Clipboard

Als binnen de Transaction een functie wordt aangeroepen die een eigen Transaction uitvoert is dat geen probleem.

Je kunt ook overwegen om in je hoofdfunctie (bijvoorbeeld een CommandMethod) een Transaction te starten (sowieso goed omdat dit de overkoepelende Undo actie verzorgt) die je vervolgens als parameter meegeeft aan alle functies. Zo hoef je in elke functie niet een aparte Transaction te starten maar gebruik je gewoon de beschikbaar gestelde.