Python MySQL并锁定一个表,读取,然后截断

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

我正在python中使用mysqldb

我需要为一张桌子做以下操作

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?这有助于节省重写某些存储过程的时间:如果删除表,锁将被释放。这意味着在删除表和重新创建表之间的瞬间读取/写入表的其他客户端将获取表,但不存在错误,而不是阻塞。如果这是不可接受的,那么您需要清空表,而不是丢弃它。