Frankly, customisers currently don't make use of error trapping adequately .. I'd be bold enough to suggest that the majority don't understand how they work.
You're suggesting that another level of complication be added into the mix.
I'm with you on that yes. Too many LSP's which cause stuff like OSMode / Highlight to go all wonky. Same thing could happen with these transactions I guess: i.e. user presses Esc, lisp fails to dispose/commit transaction ---->> user's unable to continue working in DWG as he's unable to modify anything until the transaction is ended (which will never end).
I'm just of the opinion, you shouldn't need to hamstring a language just because some (or even the great majority) of the "programmers" using it aren't doing it properly. At what point do you start thinking - this is too much power given to the programmer, versus where do you stop trying to make the language fool proof? Where you've turned all error handling into something synonymous with garbage collection or where you let the programmer handle all items which should be reset on an error?
For me, it would be more beneficial adding .net functions that take lisp association lists of the keys,values to be changed and do all the grunt work in .net .. that way the complete operation can be wrapped without issue.
That's a good idea too - though it's actually already implemented through ARX in the entmod routine for one entity at a time. This would basically be something like an entmod-multiple: i.e. send the function a list of dxf-data lists.
Actually this is where I think transactions could actually make Lisp more fool-proof. Rather than having the Lisp programmer write a full *error* defun which reverts all the modified items back to their original state - they now only need to call the single dispose on the transaction.
Or
it might even be more advisable (read: More Fool Proof) to have a function which works like the using clause: Send the function a list of lisp instructions to perform on the list of entities. Then that DotNet function can wrap it all inside a transaction and roll back if it reaches an error. I.e. you implement the lisp eval calls inside a try-catch-finally block so you can ensure that (no matter what error's occurred) the transaction (and whatever other setting / reference you deem necessary) is rolled-back gracefully without the lisp programmer even needing to know about it.