У меня есть система C ++, которая использует код afxdb в MFC для доступа и обновления базы данных SQL Server через соединение ODBC.
В рамках работы над некоторыми проблемами с SQL Server 2016 разработчик нашел эту документацию и поделился ею:
https://msdn.microsoft.com/en-us/library/ecc2bf09.aspx
В частности, этот комментарий: «Если вы закрываете набор записей или связанный с ним объект CDatabase, когда выполняется транзакция (вы не называли CDatabase :: CommitTrans или CDatabase :: Rollback), транзакция будет откатываться автоматически (если только не серверная часть вашей базы данных ядро базы данных Microsoft Jet)
Код открывается и закрывает наборы записей повсюду без автоматического отката. Например, очень распространенный шаблон:
Open Database
Begin Transaction
Open RecordsetA
Update something with RecordsetA
Close RecordsetA
Open RecordsetB
Update something with RecordsetB
Close RecordsetB
If OK then Commit else Rollback
Close Database
И это работает так, как я ожидаю, что это сработает, вся транзакция фиксируется или откатывается при явном подтверждении или откате, а не при закрытии набора записей.
Однако, если я правильно читаю документацию, когда набор записей закрыт, транзакция должна быть откатана.
Это было бы кошмаром для работы в коде, мы должны были бы иметь дело с каждым набором записей и не закрывать их до тех пор, пока транзакция не будет обработана. Каждая подпрограмма, которую мы вызываем, должна была бы передать наборы записей, которые она открыла, обратно вызывающей стороне для закрытия после обработки транзакции.
Так правильна ли документация, а Microsoft просто не реализовала ее?
Есть ли что-то, что я пропускаю, и есть способ переопределить это, что где-то в нашем старом коде разработчик однажды установил?
Документация не распространяется на нас?
Или документация неверна?
Задача ещё не решена.
Других решений пока нет …