6

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")
4

2 に答える 2

11

書き込みのためにロックされているテーブルを切り捨てることはできません。これは、「切り捨て」が「テーブルを破棄し、同じスキーマで新しいテーブルを再作成する」ことを意味するためです。

ただし、テーブルをにすることはできます。TRUNCATE TABLE asin_one_time_only使用する代わりにDELETE FROM asin_one_time_only。これは自動インクリメントの番号付けをリセットしないことに注意してください。それもリセットしたい場合は、ALTER TABLE asin_one_time_only auto_increment=1

これを行うことをお勧めします:

LOCK TABLES asin_one_time_only READ;
SELECT asin FROM asin_one_time_only;
-- minimize the possibility of someone writing to the table in-between
-- an "UNLOCK TABLES" and a "LOCK TABLES" by just issuing a new LOCK TABLES
-- I am not 100% sure that MySQL will do this atomically, so there is a
-- possibility that you may delete a row that was not read.
-- If this is unacceptable, then use a "LOCK TABLES asin_one_time_only WRITE"
-- from the very beginning.
LOCK TABLES asin_one_time_only WRITE;
DELETE FROM asin_one_time_only;
ALTER TABLE asin_one_time_only auto_increment=1;
UNLOCK TABLES;
于 2012-08-12T10:13:33.870 に答える
1

書き込み用にロックされているテーブルを切り捨てることはできません。

この問題に関する全体的な議論がここにあります: http://bugs.mysql.com/bug.php?id=20667

ただし、できることは、テーブルを削除して再作成することです。

于 2012-08-12T10:08:48.327 に答える