Qt接続内でトランザクションを使用しようとしていますが、正しく動作するかどうかわかりません。 私のデータベースはMySQLインスタンスであり、テーブルはInnoDBエンジンを使用しているので、トランザクションはサポートされています。MySQLでQtトランザクションのロールバックが失敗する
私は、トランザクション内でテーブルのレコードを削除し、最終的には既に存在するテーブルを作成する小さなテストを書きました。作成スクリプトが失敗すると、私はそれをロールバックして処理しようとします。
私が期待していることは、ロールバックすると、レコードは削除されないということです。しかし、私が得たのは、ロールバック機能が呼び出されるとすぐにレコードが削除されるということです。
#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;
}
オブジェクト修正文の一つですので、あなたがロールバックとにかくTABLEを作成できないことに注意してキープライマリの重複エントリを追加しようとします。挿入が失敗すると、私はロールバックメソッドを呼び出し、トランザクション全体が期待通りにロールバックされます。 さらに、接続開始後にトランザクションを開始するコードを移動しなければなりませんでした。ありがとう –