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 차에 대해 중복 항목을 추가하려고 시도합니다. 삽입이 실패하면 롤백 메서드를 호출하고 전체 트랜잭션이 예상대로 롤백됩니다. 게다가 연결을 연 후 트랜잭션을 시작하는 코드를 이동해야했습니다. 감사 –