docs: def doTransaction(conn, start=True, startSQL='START TRANSACTION'):
      '''
      wrap a connection in a transaction.  starts a transaction, yields the conn, and then if an exception occurs, calls rollback().  otherwise calls commit().
      start: if True, executes 'START TRANSACTION' sql before yielding conn.  Useful for connections that are autocommit by default.
      startSQL: override if 'START TRANSACTION' does not work for your db server.
      '''
      try:
          if start:
              executeSQL(conn, startSQL)
          yield conn
      except:
          if conn is not None:
              conn.rollback()
          raise
      else:
          conn.commit()