2

Python/django から MySQL データベースのロックをテストしています。

私はテーブルを持っています、私はテストしています:

CREATE TABLE `test` (
  `id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

insert into test (id) values (1), (2);
commit;

私は 3 つのセッションを持っています: - 2 つの mysql コンソール - 1 つの django ビュー

コンソール 1:

mysql> begin; select t.id from test as where id = 1 t FOR UPDATE;
Query OK, 0 rows affected (0.00 sec)

+----+
| id |
+----+
|  1 |
+----+
1 row in set (0.00 sec)

コンソール 2:

mysql> set @@session.innodb_lock_wait_timeout = 1;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select t.id from test as t FOR UPDATE;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

mysql> select t.id from test as t where id = 1 FOR UPDATE;
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction

ジャンゴ ビュー:

@db.transaction.commit_manually
def Test(request):
  c = db.connection.cursor()
  c.execute('set @@session.innodb_lock_wait_timeout = 1')
  c.execute('select t.id from test as t FOR UPDATE')
  logging.error(c.fetchall())
  c.execute('select t.id from test as t where id = 1 FOR UPDATE')
  logging.error(c.fetchall())
  db.transaction.rollback()

  return render_to_response(
      'test.html',
      context_instance=template.RequestContext(request, {})
      )

このビューを呼び出した後、例外が発生することが予想されますが、何も起こらず、空の結果セットが返されます。

理由はありますか?

バージョン:

  • パイソン: 2.7.3
  • ジャンゴ: 1.4.3
  • MySQL: 5.5

ありがとう、ダニエル

4

1 に答える 1

0

トランザクションを使用しています。autocommit はトランザクションを無効にしません。ステートメントの最後に自動的にコミットするだけです。

何が起こっているかというと、他のスレッドがレコードのロックを長時間保持していて、スレッドがタイムアウトになっています。

ソース: トランザクションを使用していないにもかかわらず、「ロック待機タイムアウトを超えました。トランザクションを再起動してください」というメッセージが表示される

innodb_lock_wait_timeout=50(デフォルト)を設定して InnoDB のロック待機タイムアウト値を増やすか、より高い値に設定して MySQL を再起動する必要があります。

于 2013-04-15T14:36:08.617 に答える