Здравствуйте.
Ситуация следующая. Есть SQL Server 2008, в программе используется драйвер QODBC3.
Соединение установлено, данные пишутся/читаются.
Проблема, видимо, в отсутствии понимания принципа работы с вложенными транзакциями. Судя по документации к восьмому серверу, каждый новый BEGIN TRANSACTION увеличивает счётчик TRANCOUNT на единицу. Каждый COMMIT уменьшает его на 1. Транзакция завершается и фиксируются изменения, когда счётчик станет равен 0. У меня же выходит, что первый же commit завершает транзакцию вне зависимости от того, сколько было BEGIN TRANSACTION. Пусть имеется база и запрос к ней:
db = QSqlDatabase::addDatabase("QODBC3");
...
query = new QSqlQuery(db);
...
Выполняем:
db.transaction();
query->exec("INSERT INTO TestOnly (Value) VALUES('1')");
db.transaction();
query->exec("INSERT INTO TestOnly (Value) VALUES('2')");
db.commit();
query->exec("INSERT INTO TestOnly (Value) VALUES('3')");
db.rollback();
В результате в таблице оказываются все 3 значения ('1','2','3'). И в SQL SMS видно, что после первого же коммита пропадает единственная активная транзакция. Соответвственно последующий RollBack ничего не делает.
В чём здесь проблема? Я совсем не правильно понял идею со счётчиком открытых транзакций, или просто драйвер/Qt не поддерживают такой функционал? Или я упустил что-то где-то в настройках (сервера/драйвера)?
И на случай, если я совсем что-то не то творю и не тем образом, и есть более человеческий способ. Зачем мне вообще это нужно:
Есть необходимость использовать внутри "
составной" функции, состоящий из нескольких операций, функции "
поменьше "(отдельно на каждую из операций). Функции "
поменьше" могут вызываться и самостоятельно, поэтому обрамлены своим набором:db.transaction(),db.rollback(),db.commit(). В "составной" же всё действо обрамлено ещё одним набором открытия/закрытия транзакции ради того, что бы можно было разом откатить все входящие в её состав операции "
поменьше", если где-то по ходу дела станет ясно, что всё пошло не так. Но задумка/реализация явно не удалась.