Maaf atas jawaban yang panjang, tetapi ini perlu dijawab dalam beberapa bagian.
1. Saat mengunci tabel InnoDB dengan LOCK TABLES
secara umum
Menggunakan LOCK TABLES
dengan InnoDB sebenarnya berfungsi, dan dapat ditunjukkan dengan dua contoh MySQL CLI yang terhubung ke server yang sama (dilambangkan dengan mysql-1
dan mysql-2
) pada contoh di bawah ini. Biasanya harus dihindari dalam konteks produksi apa pun karena berdampak pada klien, tetapi terkadang ini bisa menjadi satu-satunya pilihan.
Buat tabel dan isi dengan beberapa data:
mysql-1> create table a (id int not null primary key) engine=innodb;
Query OK, 0 rows affected (0.02 sec)
mysql-1> insert into a (id) values (1), (2), (3);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
Kunci meja:
mysql-1> lock tables a write;
Query OK, 0 rows affected (0.00 sec)
Coba masukkan dari mysql-2
, yang akan menunggu di kunci:
mysql-2> insert into a (id) values (4);
Sekarang buka kunci tabel dari mysql-1
:
mysql-1> unlock tables;
Query OK, 0 rows affected (0.00 sec)
Dan akhirnya mysql-2
membuka blokir dan mengembalikan:
Query OK, 1 row affected (6.30 sec)
2. Menggunakan phpMyAdmin untuk pengujian
Metode pengujian Anda menggunakan phpMyAdmin tidak valid karena phpMyAdmin tidak mempertahankan koneksi persisten ke server di antara kueri dari antarmuka webnya. Untuk menggunakan penguncian LOCK TABLES
, START TRANSACTION
, dll., Anda perlu mempertahankan koneksi saat kunci ditahan.
3. Mengunci semua tabel yang diperlukan selama bekerja
Cara MySQL mengunci tabel, setelah Anda menggunakan LOCK TABLES
untuk mengunci apa pun secara eksplisit, Anda tidak akan dapat mengakses tabel lain yang tidak dikunci secara eksplisit selama LOCK
... UNLOCK
sidang. Dalam contoh Anda di atas, Anda perlu menggunakan:
LOCK TABLES my_table WRITE, new_table WRITE, table2 READ;
(Saya berasumsi table2
digunakan dalam subpilihan bukan salah ketik.)
4. Tukar tabel atom menggunakan RENAME TABLE
Selain itu, saya harus mencatat bahwa mengganti tabel yang ada menggunakan DROP TABLE
diikuti oleh RENAME TABLE
akan menyebabkan momen singkat di mana tabel tidak ada, dan ini dapat membingungkan klien yang mengharapkannya ada. Biasanya jauh lebih baik untuk dilakukan:
CREATE TABLE t_new (...);
<Populate t_new using some method>
RENAME TABLE t TO t_old, t_new TO t;
DROP TABLE t_old;
Ini akan melakukan pertukaran atom dari dua tabel.