Python MySQL并锁定一个表,读取,然后截断
我正在python中使用mysqldb 我需要为一张桌子做以下操作Python MySQL并锁定一个表,读取,然后截断,python,mysql,mysql-python,Python,Mysql,Mysql Python,我正在python中使用mysqldb 我需要为一张桌子做以下操作 1) Lock 2) Read 3) Truncate the table 4) Unlock 当我运行下面的代码时,我得到下面的错误。因此,我不确定如何锁定一个表来读取它,然后截断该表。我需要确保没有其他连接读取数据 asin_list = [] conn = MySQLdb.connect(host=parms['database']['operations']['host'],user=parms['datab
1) Lock
2) Read
3) Truncate the table
4) Unlock
当我运行下面的代码时,我得到下面的错误。因此,我不确定如何锁定一个表来读取它,然后截断该表。我需要确保没有其他连接读取数据
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")
无法截断锁定写入的表 这里有一场关于这个问题的辩论:
但是,您可以做的是删除表并重新创建它。您不能截断为写入而锁定的表。这是因为truncate意味着销毁该表,并使用相同的模式重新创建一个新表 然而,你可以清空桌子。使用DELETE FROM asin\u one\u time\u代替截断表asin\u one\u time\u。请注意,这不会重置自动递增编号。如果您还想重置它,请使用ALTER TABLE asin_one_time_only auto_increment=1 我建议这样做: 将表锁定为一次只读; 从asin\u中选择asin(仅一次); -尽量减少中间有人向表格写信的可能性 -只需发出一个新的锁表,即可解锁表和锁表 -我不能百分之百确定MySQL是否能做到原子级,因此有一个 -删除未读取的行的可能性。 -如果这是不可接受的,则使用锁定表作为一次性写入 -从一开始。 将表锁定为一次写入; 仅从asin_中删除一次; 将表格更改为一次自动增量=1; 解锁表格;
I此错误是我从表中删除而不是从trncate中删除。“amz_one_time_only”未使用锁表锁定您的表是amz_one_time_only还是asin_one_time_only?这有助于节省重写某些存储过程的时间:如果删除表,锁将被释放。这意味着在删除表和重新创建表之间的瞬间读取/写入表的其他客户端将获取表,但不存在错误,而不是阻塞。如果这是不可接受的,那么您需要清空表,而不是丢弃它。