Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

MS-DTC, Sql Server et auto-commit impossible à débrancher

2 réponses
Avatar
Jean-Pierre DUVAL
Je n'arrive pas à débrancher l'auto-commit pour un client Odbc / Native
Client se connectant à Sql Server 2005 en utilisant MS-DTC.

Voici 4 cas de figures pour éclaircissement en pseudo-code :

1) Sans MS DTC.

Il faut faire :

1.1) SQLConnect().

1.2) SQLSetConnAttr(hMaConnexion,
SQL_ATTR_AUTOCOMMIT,SQL_AUTO_COMMIT_OFF,SQL_IS_UINTEGER);

1.3) SQLEndTrans pour invalider la transaction.

Cela fonctionne.

2) Avec MS DTC sans code particulier.

Il faut faire :

2.1) DtcGetTransactionManager().

2.2) SQLConnect();

2.3) ITransactionDispenser::BeginTransaction().

2.4) ITransaction::Abort() pour invalider.

Mais les modifications reste en base. Donc cela ne fonctionne pas.

3) Avec MS DTC avec SQLSetConnAttr.

Il faut faire :

3.1) DtcGetTransactionManager().

3.2) SQLConnect();

3.3) ITransactionDispenser::BeginTransaction().

3.4) SQLSetConnAttr(hMaConnexion,
SQL_ATTR_AUTOCOMMIT,SQL_AUTO_COMMIT_OFF,SQL_IS_UINTEGER);

Erreur : une transaction distribuée est déjà en cours.

4) Avec MS DTC avec SQLSetConnAttr - Bis.

Il faut faire :

4.1) DtcGetTransactionManager().

4.2) SQLConnect();

4.3) SQLSetConnAttr(hMaConnexion,
SQL_ATTR_AUTOCOMMIT,SQL_AUTO_COMMIT_OFF,SQL_IS_UINTEGER);

4.4) ITransactionDispenser::BeginTransaction().

4.5) ITransaction::Abort() pour invalider.

Mais les modifications reste en base. Donc cela ne fonctionne pas.

Meme résultat si j'emploi SQLExecDirect(hMaConnexion,"SET
IMPLICIT_TRANSACTIONS OFF",SQL_NTS) au lieu de SQLSetConnAttr(hMaConnexion,
SQL_ATTR_AUTOCOMMIT,SQL_AUTO_COMMIT_OFF,SQL_IS_UINTEGER);

Comment faire un Rollback avec MS DTC et Sql Server ?

Merci pour votre aide.
--
Jean-Pierre DUVAL

2 réponses

Avatar
Med Bouchenafa
Pour les connexions ODBC utilisant MDTC, il faut passer l'option
SQL_COPT_SS_ENLIST_IN_DTC à la fonction SQLSetConnectAttr
http://support.microsoft.com/kb/315823/
http://msdn2.microsoft.com/en-us/library/ms190799.aspx
--
Bien cordialement
Med Bouchenafa


"Jean-Pierre DUVAL" wrote in
message news:
Je n'arrive pas à débrancher l'auto-commit pour un client Odbc / Native
Client se connectant à Sql Server 2005 en utilisant MS-DTC.

Voici 4 cas de figures pour éclaircissement en pseudo-code :

1) Sans MS DTC.

Il faut faire :

1.1) SQLConnect().

1.2) SQLSetConnAttr(hMaConnexion,
SQL_ATTR_AUTOCOMMIT,SQL_AUTO_COMMIT_OFF,SQL_IS_UINTEGER);

1.3) SQLEndTrans pour invalider la transaction.

Cela fonctionne.

2) Avec MS DTC sans code particulier.

Il faut faire :

2.1) DtcGetTransactionManager().

2.2) SQLConnect();

2.3) ITransactionDispenser::BeginTransaction().

2.4) ITransaction::Abort() pour invalider.

Mais les modifications reste en base. Donc cela ne fonctionne pas.

3) Avec MS DTC avec SQLSetConnAttr.

Il faut faire :

3.1) DtcGetTransactionManager().

3.2) SQLConnect();

3.3) ITransactionDispenser::BeginTransaction().

3.4) SQLSetConnAttr(hMaConnexion,
SQL_ATTR_AUTOCOMMIT,SQL_AUTO_COMMIT_OFF,SQL_IS_UINTEGER);

Erreur : une transaction distribuée est déjà en cours.

4) Avec MS DTC avec SQLSetConnAttr - Bis.

Il faut faire :

4.1) DtcGetTransactionManager().

4.2) SQLConnect();

4.3) SQLSetConnAttr(hMaConnexion,
SQL_ATTR_AUTOCOMMIT,SQL_AUTO_COMMIT_OFF,SQL_IS_UINTEGER);

4.4) ITransactionDispenser::BeginTransaction().

4.5) ITransaction::Abort() pour invalider.

Mais les modifications reste en base. Donc cela ne fonctionne pas.

Meme résultat si j'emploi SQLExecDirect(hMaConnexion,"SET
IMPLICIT_TRANSACTIONS OFF",SQL_NTS) au lieu de
SQLSetConnAttr(hMaConnexion,
SQL_ATTR_AUTOCOMMIT,SQL_AUTO_COMMIT_OFF,SQL_IS_UINTEGER);

Comment faire un Rollback avec MS DTC et Sql Server ?

Merci pour votre aide.
--
Jean-Pierre DUVAL


Avatar
Jean-Pierre DUVAL
Bonjour.

J'ai bien évidemment utilisé SQLSetConnectAttr(SQL_COPT_SS_ENLIST_IN_DTC)
comme cela est décrit dans MSDN. Ce n'est pas pour autant que cela débranche
l'autocommit. Confère les cas de tests dans mon premier message.

En mettant un point d'arrêt sur juste avant ITransaction::Abort, en ouvrant
une connexion avec Microsoft Management Console, je vois les lignes insérées
pour lesquelles je veux annuler la transaction. Idem juste après
ITransaction::Abort.
Donc l'autocommit reste activé quand bien même je le désactive au moyen
indiqué dans les cas de tests.

Merci pour votre aide.

--
Jean-Pierre DUVAL


"Med Bouchenafa" a écrit :

Pour les connexions ODBC utilisant MDTC, il faut passer l'option
SQL_COPT_SS_ENLIST_IN_DTC à la fonction SQLSetConnectAttr
http://support.microsoft.com/kb/315823/
http://msdn2.microsoft.com/en-us/library/ms190799.aspx
--
Bien cordialement
Med Bouchenafa


"Jean-Pierre DUVAL" wrote in
message news:
> Je n'arrive pas à débrancher l'auto-commit pour un client Odbc / Native
> Client se connectant à Sql Server 2005 en utilisant MS-DTC.
>
> Voici 4 cas de figures pour éclaircissement en pseudo-code :
>
> 1) Sans MS DTC.
>
> Il faut faire :
>
> 1.1) SQLConnect().
>
> 1.2) SQLSetConnAttr(hMaConnexion,
> SQL_ATTR_AUTOCOMMIT,SQL_AUTO_COMMIT_OFF,SQL_IS_UINTEGER);
>
> 1.3) SQLEndTrans pour invalider la transaction.
>
> Cela fonctionne.
>
> 2) Avec MS DTC sans code particulier.
>
> Il faut faire :
>
> 2.1) DtcGetTransactionManager().
>
> 2.2) SQLConnect();
>
> 2.3) ITransactionDispenser::BeginTransaction().
>
> 2.4) ITransaction::Abort() pour invalider.
>
> Mais les modifications reste en base. Donc cela ne fonctionne pas.
>
> 3) Avec MS DTC avec SQLSetConnAttr.
>
> Il faut faire :
>
> 3.1) DtcGetTransactionManager().
>
> 3.2) SQLConnect();
>
> 3.3) ITransactionDispenser::BeginTransaction().
>
> 3.4) SQLSetConnAttr(hMaConnexion,
> SQL_ATTR_AUTOCOMMIT,SQL_AUTO_COMMIT_OFF,SQL_IS_UINTEGER);
>
> Erreur : une transaction distribuée est déjà en cours.
>
> 4) Avec MS DTC avec SQLSetConnAttr - Bis.
>
> Il faut faire :
>
> 4.1) DtcGetTransactionManager().
>
> 4.2) SQLConnect();
>
> 4.3) SQLSetConnAttr(hMaConnexion,
> SQL_ATTR_AUTOCOMMIT,SQL_AUTO_COMMIT_OFF,SQL_IS_UINTEGER);
>
> 4.4) ITransactionDispenser::BeginTransaction().
>
> 4.5) ITransaction::Abort() pour invalider.
>
> Mais les modifications reste en base. Donc cela ne fonctionne pas.
>
> Meme résultat si j'emploi SQLExecDirect(hMaConnexion,"SET
> IMPLICIT_TRANSACTIONS OFF",SQL_NTS) au lieu de
> SQLSetConnAttr(hMaConnexion,
> SQL_ATTR_AUTOCOMMIT,SQL_AUTO_COMMIT_OFF,SQL_IS_UINTEGER);
>
> Comment faire un Rollback avec MS DTC et Sql Server ?
>
> Merci pour votre aide.
> --
> Jean-Pierre DUVAL