0

addTask() および removeTask() 関数を使用しようとすると、非常に長い待機時間の後にエラーが発生します。

関数は次のとおりです。

def addTask():

    name = raw_input("Enter the name of the task you would like to add: ")
    exists = cur.execute("SELECT Name FROM Tasks WHERE Name = '%s';" % name)
    if exists:
        print("Task already exists.")
    else:
        cur.execute("INSERT INTO Tasks(Name, Time) VALUES('%s', 0);" % name)
        print("'%s' has been added to the task list." % name)

def removeTask():

    name = raw_input("Enter name of the task you would like to delete: ")
    exists = cur.execute("SELECT Name FROM Tasks WHERE Name = '%s';" % name)
    if exists:
        cur.execute("DELETE FROM Tasks WHERE Name = '%s';" % name)
        print("'%s' has been removed from the task list." % name)
    else:
        print("Task doesn't exist.")

addTask() 関数に既に存在する名前を入力すると、正常に機能します。ただし、 addTask() 関数で新しい名前の新しいタスクを追加しようとすると、次のエラーが発生します。

Traceback (most recent call last):
  File "./timelog3.py", line 137, in <module>
    main()
  File "./timelog3.py", line 23, in main
    addTask()
  File "./timelog3.py", line 44, in addTask
    cur.execute("INSERT INTO Tasks(Name, Time) VALUES('%s', 0);" % name)
  File "/usr/local/lib/python2.7/dist-packages/MySQL_python-1.2.4b4-py2.7-linux-    x86_64.egg/MySQLdb/cursors.py", line 202, in execute
    self.errorhandler(self, exc, value)
  File "/usr/local/lib/python2.7/dist-packages/MySQL_python-1.2.4b4-py2.7-linux-x86_64.egg/MySQLdb/connections.py", line 36, in defaulterrorhandler
    raise errorclass, errorvalue
_mysql_exceptions.OperationalError: (1205, 'Lock wait timeout exceeded; try restarting     transaction')

削除機能についても同様に、存在しないタスク名を試してみると正常に動作します。しかし、存在するタスクを削除しようとすると、同じエラーが発生します。

本当に困惑しているのは、数分前までは問題なく動作していたのに、何も変更していなかった (または変更した内容を思い出せない) ことです。

4

1 に答える 1

0

あなたが得ているエラーは、誰かがテーブル (またはデータベース全体、またはデータの他のサブセット) をロックしていることを示しています。

したがって、別のプログラムがデータベースを使用しているか、プログラムがデータベースへの複数の接続を持っているか、プログラムが単一の接続を持っていて、インターリーブされた 2 つのことを実行しようとしています (複数のスレッドがある場合は同時に)。 .

1 つの一般的な可能性として、スクリプトを開始し、それをバックグラウンドに置いてから、同じスクリプトを再度開始すると、スクリプトが互いに競合していることが考えられます。数分前は、2 つのコピーが実行されていなかったため、すべて正常に機能していました。

于 2013-11-12T21:30:49.017 に答える