diff --git a/synapse/storage/__init__.py b/synapse/storage/__init__.py
index c09228c37f21768362931d4264e642ea8bf6d92a..87189e54b818f25d415b2bf8b524873777a82219 100644
--- a/synapse/storage/__init__.py
+++ b/synapse/storage/__init__.py
@@ -583,7 +583,7 @@ def prepare_database(db_conn):
     """Prepares a database for usage. Will either create all necessary tables
     or upgrade from an older schema version.
     """
-    with db_conn:
+    try:
         cur = db_conn.cursor()
         version_info = _get_or_create_schema_state(cur)
 
@@ -596,6 +596,10 @@ def prepare_database(db_conn):
         cur.execute("PRAGMA user_version = %d" % (SCHEMA_VERSION,))
 
         cur.close()
+        db_conn.commit()
+    except:
+        db_conn.rollback()
+        raise
 
 
 def _setup_new_database(cur):