Я пытаюсь использовать транзакции в соединении Qt, но не могу понять, как они работают правильно. Моя база данных представляет собой экземпляр MySQL, а таблицы используют механизм InnoDB, поэтому транзакции поддерживаются.
Я написал небольшой тест, в котором в рамках транзакции я удаляю запись в таблице и в конечном итоге создаю уже существующую таблицу. Когда сценарий создания терпит неудачу, я пытаюсь справиться с этим, откатываясь.
Я ожидаю, что при откате запись не будет удалена. Однако я получил то, что как только вызывается функция отката, запись удаляется.
#include <QApplication>
#include <QtSql>
#include <QtDebug>
int main( int argc, char **argv )
{
QApplication app( argc, argv );
QSqlDatabase db = QSqlDatabase::addDatabase( "QMYSQL" );
db.setHostName( QString("XXXXX")) ;
db.setDatabaseName( "db_test" );
db.setUserName( "X" );
db.setPassword( "X" );
QSqlDatabase::database().transaction();
QSqlQuery q;
if( !db.open() )
{
qDebug() << db.lastError();
qFatal( "Failed to connect." );
}
qDebug( "Connected!" );
q.prepare("DELETE FROM vendita WHERE matricola = :m and idOrdine = 530 and idStab = 1");
q.bindValue(":m","0032110275928");
if( !q.exec() ){
qDebug("error");
return 0;
}
//this fails, the table already exists
q.prepare( "CREATE TABLE test (id INTEGER UNIQUE PRIMARY KEY, firstname VARCHAR(30), lastname VARCHAR(30))" );
if( !q.exec() )
{
qDebug() << q.lastError();
bool res = QSqlDatabase::database().rollback();
qDebug() << res;
return 0;
}
else
{
qDebug() << "Table created!";
QSqlDatabase::database().commit();
}
db.close();
return 0;
}