Маленький пример на тему того, как не меняя программный код можно управлять способом работы с базой данных чертежа: с использованием транзакции, или же с её эмуляцией. Используя такой подход можно моментально поменять способ работы сразу во многих местах, не внося правки в исходный код.

// © Андрей Бушман, 2014
// Commands.cs
// AutoCAD 2009 SP3
// Код предназначен для демонстрации того, как можно, не внося изменений в 
// исходный код, менять способ работы с базой данных чертежа: с использованием 
// транзакции или же с её эмуляцией.

using System;

#if AUTOCAD
using cad = Autodesk.AutoCAD.ApplicationServices.Application;
using Ap = Autodesk.AutoCAD.ApplicationServices;
using Db = Autodesk.AutoCAD.DatabaseServices;
using Ed = Autodesk.AutoCAD.EditorInput;
using Gm = Autodesk.AutoCAD.Geometry;
using Rt = Autodesk.AutoCAD.Runtime;
#endif

[assembly: Rt.CommandClass(typeof(Bushman.CAD.Sandbox.TransactionGames.Commands
    ))]

namespace Bushman.CAD.Sandbox.TransactionGames {
    public sealed class Commands {

        /// <summary>
        /// Тестовая команда
        /// </summary>
        [Rt.CommandMethod("SwitchTransactionSample")]
        public void SwitchTransactionSample() {

            Ap.Document doc = cad.DocumentManager.MdiActiveDocument;
            if (null == doc)
                return;
            Db.Database db = doc.Database;
            Db.TransactionManager tm = db.TransactionManager;
            Ed.Editor ed = doc.Editor;

            Ed.PromptKeywordOptions pso = new Ed.PromptKeywordOptions(
                "Использовать транзакцию?");
            String yes = "Yes";
            String no = "No";
            pso.Keywords.Add(yes);
            pso.Keywords.Add(no);
            pso.AppendKeywordsToMessage = true;
            pso.Keywords.Default = yes;

            Ed.PromptResult pr = ed.GetKeywords(pso);
            ed.WriteMessage("Вы выбрали: {0}n", pr.StringResult);

            if (Ed.PromptStatus.OK != pr.Status) {
                ed.WriteMessage("Выполнение команды прервано.n");
            }

            Boolean transaction_use = pr.StringResult == yes;

            // Т.к. OpenCloseTransaction наследуется от Transaction, то 
            // получить Transaction можно следующим образом:
            using (Db.Transaction tr = GetTransaction(tm, transaction_use)) {

                Db.DBText text = new Db.DBText();
                text.SetDatabaseDefaults(db);
                text.Height = 30;
                Double y = 100;
                String text_string = String.Empty;

                if (transaction_use) {
                    text_string = "Текст создан с использованием транзакции.";
                }
                else {
                    y = 200;
                    text_string = "Текст создан с эмуляцией транзакции.";
                }

                text.Position = new Gm.Point3d(100, y, 0);
                text.TextString = text_string;

                Db.BlockTableRecord model_space = tr.GetObject(
                    db.CurrentSpaceId, Db.OpenMode.ForWrite)
                    as Db.BlockTableRecord;

                model_space.AppendEntity(text);
                tr.AddNewlyCreatedDBObject(text, true);

                tr.Commit();
            }
        }

        /// <summary>
        /// Данный метод позволяет выбрать способ работы с базой данных 
        /// чертежа: с использованием транзакции или же с её эмуляцией.
        /// </summary>
        /// <param name="tm">Менеджер транзакций</param>
        /// <param name="emulate"><c>true</c> - использовать транзакцию; 
        /// <c>false</c> - эмулировать транзакцию. 
        /// </param>
        /// <returns>Возвращается объект <c>Transaction</c> (
        /// <c>OpenCloseTransaction</c> унаследован от этого класса).</returns>
        Db.Transaction GetTransaction(Db.TransactionManager tm,
            Boolean transaction_use) {
            Db.Transaction tr = transaction_use ? tm.StartTransaction() :
                tm.StartOpenCloseTransaction();
            return tr;
        }
    }
}