2017-05-23 4 views
1

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; 
} 

答えて

1

しかし、私が持ってすぐにロールバック関数が呼び出されるように、レコードが削除されることです。

CREATE TABLE文を実行すると、最初のクエリ(レコードの削除に使用したもの)の暗黙のコミットが発生します。したがって、CREATE TABLEが失敗したかどうかに関係なく、レコードは削除されます。あなたがステートメントを実行する前にCOMMITを行っていたかのようhttps://dev.mysql.com/doc/refman/5.6/en/implicit-commit.htmlから

このセクションに記載されているステートメント(そしてそれらの同義語)は、暗黙的に、現在のセッションでアクティブなすべてのトランザクションを終了します。また

は、それがデータ定義言語(DDL)定義またはデータベースは、私がINSERT文でのDDL statementeを置き換え

+0

オブジェクト修正文の一つですので、あなたがロールバックとにかくTABLEを作成できないことに注意してキープライマリの重複エントリを追加しようとします。挿入が失敗すると、私はロールバックメソッドを呼び出し、トランザクション全体が期待通りにロールバックされます。 さらに、接続開始後にトランザクションを開始するコードを移動しなければなりませんでした。ありがとう –

関連する問題