MySQL et verrouiller une table, lire, et puis tronquer
Je suis à l'aide de mysqldb en python.
J'ai besoin de faire ce qui suit pour avoir une table.
1) Lock
2) Read
3) Truncate the table
4) Unlock
Lorsque j'exécute le code ci-dessous, j'obtiens l'erreur ci-dessous. Donc, je suis plutôt vous ne savez pas comment verrouiller une table pour la lecture, puis la troncation de la table. J'ai besoin d'être sûr qu'aucune autre connexion lit les données.
asin_list = []
conn = MySQLdb.connect(host=parms['database']['operations']['host'],user=parms['database']['operations']['username'],passwd=parms['database']['operations']['password'],db=parms['database']['operations']['database'])
cursor = conn.cursor()
query = "LOCK TABLES asin_one_time_only READ"
cursor.execute(query)
print 'fu1'
query = """select asin FROM asin_one_time_only"""
cursor.execute(query)
rows = cursor.fetchall()
for row in rows:
asin_list.append(row[0])
print asin_list
print 'fu2'
query = "UNLOCK TABLES;"
cursor.execute(query)
conn.commit()
print 'fu3'
query = "LOCK TABLES asin_one_time_only WRITE"
cursor.execute(query)
query = """truncate table amz_one_time_only"""
cursor.execute(query)
conn.commit()
print 'fu3'
query = "UNLOCK TABLES;"
cursor.execute(query)
conn.commit()
cursor.close()
conn.close()
Traceback (most recent call last):
File "/home/ubuntu/workspace/Amazon-Products-Crawler-1/threaded_crawl.py", line 1086, in <module>
onetime = getOneTimeOnlyAsins(parms)
File "/home/ubuntu/workspace/Amazon-Products-Crawler-1/threaded_crawl.py", line 109, in getOneTimeOnlyAsins
cursor.execute(query)
File "/usr/lib/pymodules/python2.7/MySQLdb/cursors.py", line 166, in execute
self.errorhandler(self, exc, value)
File "/usr/lib/pymodules/python2.7/MySQLdb/connections.py", line 35, in defaulterrorhandler
raise errorclass, errorvalue
_mysql_exceptions.OperationalError: (1192, "Can't execute the given command because you have active locked tables or an active transaction")
OriginalL'auteur Tampa | 2012-08-12
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas tronquer une table qui est verrouillé en écriture. C'est parce que "tronquer" signifie "détruire la table, et en recréer un nouveau avec le même schéma."
Vous pouvez cependant, vide la table. Au lieu de
TRUNCATE TABLE asin_one_time_only
utilisationDELETE FROM asin_one_time_only
. Notez que ce ne sera pas réinitialiser l'auto-incrémentation de la numérotation. Si vous souhaitez le réinitialiser ainsi, l'utilisationALTER TABLE asin_one_time_only auto_increment=1
Je suggère de faire ceci:
Est de votre table de
amz_one_time_only
ouasin_one_time_only
?oups..mon mauvais. elle fonctionne. Merci
Cette juste aidé à enregistrer une charge de temps à réécrire certaines procédures stockées 🙂
OriginalL'auteur Francis Avila
Vous ne pouvez pas tronquer une table qui est verrouillé en écriture.
Il y a tout un débat sur la question ici: http://bugs.mysql.com/bug.php?id=20667
Ce que vous pouvez faire, cependant, c'est de déposer de la table et de le recréer.
OriginalL'auteur favoretti