As other have already pointed out that the code is really hard to follow/read to figure out how you use the transaction, so I really do not have ideas on the code logic that may be the cause of the error of GC.Collect().
However, I am very curious that why there is the need to call GC.Collect() explicitly, rather than letting .NET runtime does it automatically behand the scene? To be honest, after all these years of coding .NET framework with AutoCAD API, I never did or thought to force garbage collection. Do your process load large number of disposable objects created by your code and you feel the responsibility to remove them from the memory afterward? From your code and your brief description, I do not see that. Rather, your code opens AutoCAD entities existing in drawing via a Transaction. In AutoCAD .NET API coding, the thumb of rule is you only dispose the Acad objects your code CREATED and not add them into a transaction. For Acad Oojects existing in the AutoCAD process, such as MdiActiveDocument's Database, you do not dispose it; and for existing DBObjects opened in a transaction, you do not dispose them, the Transaction does it for you. Also, since most disposable objects is just a .NET wrapper of underline C++ objects, their disposal would depend on how the .NET wrappers were implemented, I'd leave GC.Collect() out of my code (as I said, I never used it).
I could see your code is doing some kind of batch processing, which may lead you to think GC.Collect() would release used memory by opening many drawings in the batch processing. I'd batch processing too many drawings would have memory fragmentation issue rather than garbage collection for releasing memory from disposed objects slightly earlier than .NET runtime does it automatically.
So, if I were you, assume the code does the batch processing logically sound and work as expected (which I think is hardly the case, sorry), I would just remove the GC.Collect() from the code, and let .NET runtime do its job.
If you indeed do batch process against so many drawing, or many very large drawing, that may quickly result in memory fragments and eventually dries up the available memory of the computer, you may want to use core console for the batch processing - one core console instance for one drawing, or even use Autodesk's Platform Services (online core console).