9
votes

Déterminer si la transaction SQLITE3 est active

Je suis exécutant une transaction d'extrémité sur ma base de données et occasionnellement, je reçois une erreur

# 1 que "ne peut pas commettre - aucune transaction n'est actif"

Y a-t-il un moyen de déterminer si une transaction est active avant d'essayer un commit? J'ai suivi mon "Début des transactions" à la main mais je pense qu'il y a une meilleure façon.

J'utilise l'API C


0 commentaires

4 Réponses :


-2
votes

dans SQLite, transactions créées à l'aide de la transaction de début ... La transaction finale ne nid pas.

Pour les transactions imbriquées, vous devez utiliser les commandes de sauvegarde et de libération.

voir http://www.sqlite.org/lang_transaction.html

et http://www.sqlite.org/lang_savepoint.html


2 commentaires

Vous répondez à quelque chose à propos de la nidification qui n'a rien à voir avec la question.


Oh, je suis désolé, j'ai mal compris. Je pensais que vous devez tenir compte de la comptabilité de la profondeur des transactions, ce que l'évimineux sortirait de Sync avec SQLite si cela ne l'a pas soutenait. Pour autant que je sache, il n'ya aucun moyen de demander à SQLite si c'est dans une transaction.



0
votes

C'est bizarre. Je pensais que SQLite était toujours dans une transaction, soit explicitement créé par vous ou implicitement créé par SQLite:

http://www.sqlite.org/lang_transaction.html

Alors je suppose que l'erreur signifie que ce n'est pas dans une transaction que vous avez initiée ... Et si c'est ce que vous devez savoir, il semble que SQLite s'attend à ce que vous suiviez. Pas terriblement pratique, mais je suppose que c'est le coût d'une API simple. = /


0 commentaires

15
votes

Vous voudrez peut-être vérifier ceci:

http://www.sqlite.org/c3ref/get_autocommit.html << / p>

Selon la page, si vous êtes dans une transaction, sqlite3_get_autocommit () retournera 0.


0 commentaires

1
votes

L'interface que vous recherchez est réellement implémentée dans cette prochaine version de SQLite que vous pouvez voir dans les notes: https://sqlite.org/draft/c3ref/txn_state.html

Determine the transaction state of a database

int sqlite3_txn_state(sqlite3*,const char *zSchema);

The sqlite3_txn_state(D,S) interface returns the current transaction state of schema S in database connection D. If S is NULL, then the highest transaction state of any schema on databse connection D is returned. Transaction states are (in order of lowest to highest):

SQLITE_TXN_NONE
SQLITE_TXN_READ
SQLITE_TXN_WRITE

If the S argument to sqlite3_txn_state(D,S) is not the name of a valid schema, then -1 is returned.


1 commentaires

L'explication de transaction de lecture / écriture est absente cependant. Si cette fonction renvoie «1» (Lire la transaction), cela signifie-t-il que je peux ou ne peut pas émettre une autre transaction Begn Transaction la mise à niveau vers une transaction d'écriture?