Как откатить транзакции с помощью PyQT4

Я посмотрел везде, и я не могу понять, что происходит не так.

Я хочу иметь возможность ставить в очередь несколько запросов к базе данных и иметь возможность откатить их, если какой-либо запрос завершится ошибкой. Я не смог заставить это работать, поэтому попытался свести проблему к простому примеру (запустил транзакцию, выполнил два запроса, попытался откатиться), но даже это не работает.

Этот код должен; начать транзакцию, попытаться создать две таблицы, а затем выполнить откат, чтобы в базе данных не появилось никаких изменений.

Вызов rollback() возвращает true, поэтому он говорит, что работает, но когда я смотрю в базу данных, таблицы все равно были созданы.

Вот мой код:

db = QSqlDatabase.database()
db.transaction()
q = QSqlQuery(db)
q.exec_("create table a ...") #omitted but I have checked they are fully valid queries
q.exec_("create table b ...")
db.rollback()

person Owen Tourlamain    schedule 07.09.2015    source источник


Ответы (1)


Если вы проверите документацию MySQL относительно транзакций, вы обнаружите, что любой запрос, который создает или изменяет таблицу, автоматически фиксирует текущую транзакцию, поэтому его нельзя отменить. https://dev.mysql.com/doc/refman/5.1/en/implicit-commit.html

Вам придется вручную удалить таблицы самостоятельно.

person PaulF    schedule 07.09.2015
comment
ОК, похоже, мое понимание транзакций ошибочно, в чем тогда смысл отката? Похоже, единственные вещи, которые я мог бы откатить, это select и show, что кажется немного избыточным. - person Owen Tourlamain; 07.09.2015