#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(), 那么操作也不會提交.