Особенности работы с двумя recordset в условиях транзакционной модели

Prev | Home | Next

При использовании транзакций необходимо помнить о ряде особенностей этой модели. К примеру мы хотим сделать одновременные выборки из двух таблиц и с какими-либо целями параллельно использовать эти данные. Для этого случая можно привести код, который будет работать так как нам нужно:

#include <qapplication.h>

#include <qsqldatabase.h>

#include <qsqlquery.h>

#include <qstring.h>

int main( int argc, char ** argv )

{

QApplication a( argc, argv );

QSqlDatabase *defaultDB = QSqlDatabase::addDatabase( "QODBC3" );

if ( ! defaultDB )

{

return -1;

}

defaultDB->setDatabaseName( "pubs" );

defaultDB->setUserName( "sa" );

defaultDB->setPassword( "" );

defaultDB->setHostName( "localhost" );

if ( ! defaultDB->open() )

{

return -1;

}

QSqlQuery my1;

my1.exec("SELECT fname FROM employee");

QSqlQuery my2;

my2.exec("SELECT job_desc FROM jobs");

QString lTemp;

while (my1.next() && my2.next())

{

lTemp = my1.value(0).toString() + my2.value(0).toString();

}

return 0;

}

Но если мы решим воспользоваться транзакцией, то мы получим очень интересный результат:

#include <qapplication.h>

#include <qsqldatabase.h>

#include <qsqlquery.h>

#include <qstring.h>

int main( int argc, char ** argv )

{

QApplication a( argc, argv );


QSqlDatabase *defaultDB = QSqlDatabase::addDatabase( "QODBC3" );

if ( ! defaultDB )

{

return -1;

}

defaultDB->setDatabaseName( "pubs" );

defaultDB->setUserName( "sa" );

defaultDB->setPassword( "" );

defaultDB->setHostName( "localhost" );

if ( ! defaultDB->open() )

{

return -1;

}

QSqlQuery my1;

my1.exec("SELECT fname FROM employee");

QSqlQuery my2;

defaultDB->transaction();

my2.exec("SELECT job_desc FROM jobs");

bool res = defaultDB->commit();

QString lTemp;

while (my1.next())

{

lTemp = my1.value(0).toString();

}

while (my2.next())

{

QString lTemp = my2.value(0).toString();

}


return 0;

}

Окажется, что результаты запроса my1.exec("SELECT fname FROM employee") окажутся нам недоступны. Мы не сможем получить эти данные, блок while (my1.next()){...} просто не отработает поскольку next() не будет отрабатывать и возвратит false.

Prev | Home | Next

© 2004 - 2006 [Slava Dubeiko | Дубейко Вячеслав] slava@dubeiko.com