What I remember from working with SQL server is that it comes with a management application that allows you to create graphical database schemes. Alas, they are some kind of BLOB that is not understood by anything but the management application. Working with different versions of the server and that management application was hell. Schemes can hardly be backed up or copied to another instance. Also, database backup and restore is done through the same management application. I sincerely hope that backup has improved since I worked with it, because backup always succeeded, but restore worked in less than 30% of all cases.
For MySQL, there is no irreplaceable management application. It comes with command-line applications and you can download graphical ones from MySQL, but you can use any other kind as well (like the web-based phpMyAdmin or a commercial front-end program). Most programs that offer backup possibilities create SQL files. These files can be edited in case they contain errors.
The rollback issue is as follows: your program starts a transaction and something fails (an exception is thrown or whatever). The standard error handling code is then usually:
[ol][li]Log the error.[/li]
[li]rollback the transaction as it cannot be completed anyway.[/li]
[li]inform the user[/li]
[/ol]
In that order, and error logging should never fail. If it is the database connection itself that failed, error logging should pick a file, e-mail or whatever to log to. But if you are logging to the database, the rollback will nicely delete the error log! So error handling should always go through separate channels. This does not mean I always open two connections. I open the extra one only if needed. But it is a real problem if one error triggers a "maximum connections exceeded" when it comes to logging the error.
I think you should reconsider the weight of connections when switching to MySQL. Opening a connection takes some resources off course, but not that many. There are drivers or libraries that offer connection pooling for MySQL, but you open a big can of worms if you do that. Remember that a connection is like a session. If you inherit an existing connection, you inherit all temporary tables, handlers, SQL variables, prepared statements and possibly open transactions. You should think twice and twice again before you burn yourself on connection pooling.
+++ Despite being wrong in every important aspect, that is a very good analogy +++
Hex (in Darwin's Watch)