Oh gosh, I didn’t list the db. Yes, this is MySQL. Okay, that seems spot on.
So basically this “The intent is to handle each such statement in its own special transaction” means I need to wrap up the createColumn() and createIndex() in their own transactions?
Well, no. It means that if there is an implicit commit coming with the statement you are using your transaction is useless. You can wrap statements without implicit commit in the transaction but the rest is a matter of catching exceptions and adding your own statements that for example check if the column has been added for sure or not (or just logging the error).