Qt: 事务处理片断

Qt: 事务处理片断

#include <qDebug>

#include "dbutil/DBUtil.h"

#include <QtSql>


bool insert1();

bool insert2();


int main(int argc, char *argv[]) {

    QSqlDatabase db = DBUtil::getDatabase();

    qDebug() << db.driver()->hasFeature(QSqlDriver::Transactions); // 查看数据库是否支持事务处理.

    db.transaction();

    qDebug() << "Begin transaction";


    bool ok1 = insert1();

    bool ok2 = insert2();


    if (ok1 && ok2) {

        db.commit();

        qDebug() << "Commit";

    } else {

        db.rollback();

        qDebug() << "Rollback";

    }

}


bool insert1() {

    QSqlDatabase db1 = DBUtil::getDatabase();

    QString sql1("INSERT INTO a(id) VALUES(1)");

    QSqlQuery query1(db1);


    bool ok1 = true;

    ok1 = query1.exec(sql1);


    if (!ok1) {

        qDebug() << QString("Query1: %1").arg(query1.lastError().text());

    }


    return ok1;

}


bool insert2() {

    QSqlDatabase db2 = DBUtil::getDatabase();

    QString sql2("INSERT INTO b(amount2) VALUES(30)");

    QSqlQuery query2(db2);


    bool ok2 = true;

    ok2 = query2.exec(sql2);


    if (!ok2) {

        qDebug() << QString("Query2: %1").arg(query2.lastError().text());

    }


    return ok2;

}


Qt中事务的提交, 如果在一串操作之后, 其中有失败也有成功的, 但是在调用db.commit(), 那么所有正确的操作都会更新数据库, 而失败的操作仍然失败. 所以得自己手动的使用db.rollback(), 如下面的片段:

bool ok1, ok2;

QString error1, error2;


QString sql1 = "insert into a(id) values(3)";

QString sql2 = "insert into b(amount2) values(100)";


QSqlDatabase db = DBUtil::getDatabase();

db.transaction();


QSqlQuery query1(db);

ok1 = query1.exec(sql1);


QSqlQuery query2(db);

ok2 = query2.exec(sql2);


db.commit();

因为query2操作失败, 但是query1的操作成功, 而后面使用了db.commit(), 所以query1的操作提交了, 但是query2的操作没有更新数据库. 


如果开启了事务, 在数据库操作之后, 没有手动的调用db.commit(), 那么操作也不会提交.

 

你可能感兴趣的:(Qt: 事务处理片断)