2011-01-03 9 views
1
私のPHPページで

MySQLのテーブル

LOCK TABLE invoice_numbers WRITE 
/*some stuff */ 
SELECT * FROM link_master 
/*some stuff */ 
UNLOCK TABLES 

問題をロック私の問題は、テーブルinvoice_numbersをロックした後ということです。私はlink_masterテーブルにアクセスすることはできませんが、それがそうであるのはなぜロックを解除した後、私は link_masterテーブル

にアクセスすることができますか?ロック後にlink_masterにアクセスするにはどうすればいいですか?invoice_numbersテーブル?

EDIT:

私は唯一の単一のテーブルinvoice_numbersをロックします。ロック期間中、私はデータベースから他のすべてのテーブルを使用したい。それを行う方法はありますか? mysql reference manualから

+0

申し訳ありませんが、なぜあなたは、テーブルをロックする ?私はMySQLがテーブルを自動的にロックすると思います。 –

答えて

2

ロックはそれが単一LOCK TABLESステートメントに必要なすべてのロックを取得しなければならない必要とセッション。それはLOCK TABLESステートメントでロックされていなかったので、例えば、以下のステートメントの順序で、エラーがT2にアクセスしようとするために発生します。

mysql> LOCK TABLES t1 READ; 
mysql> SELECT COUNT() FROM t1; +----------+ | COUNT() | 
+----------+ 
|  3 | 
+----------+ 
mysql> SELECT COUNT(*) FROM t2; 
ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES 

+0

しかし、それほど直観的ではないが、ロックは、あなたがdidntしたテーブルから自分自身をロックする。元のロックでは、ロックダウン期間中に使用するすべてのテーブルをロックする必要があります – davin

1

あなたはおそらくデッドロックを持っています。以下のようなもののためにあなたのコードをチェックしてください:

LOCK TABLE link_master WRITE 
/*some stuff */ 
SELECT * FROM invoice_numbers 
/*some stuff */ 
UNLOCK TABLES 

それはあなたが、両方同時に実行されている別の文で他のを1つのステートメントで一つのテーブルをロックしている可能性があります。しかし、ちょうど推測する。

チェックアウト時の私のテーブルロックの問題を:http://devoluk.com/mysql-myisam-table-lock-issue.html