Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana saya bisa mengunci tabel InnoDB untuk mencegah pembaruan saat tabel itu sedang disalin?

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. hapus tautan tidak menghapus catatan apa pun di database mysql

  2. PHP drop down yang masing-masing dapat diandalkan

  3. Setelah MySQL menginstal melalui Brew, saya mendapatkan kesalahan - Server berhenti tanpa memperbarui file PID

  4. data php dari database tidak ditampilkan setelah pencarian

  5. Apa yang terjadi ketika saya menghabiskan kunci yang dihasilkan bigint? Bagaimana menanganinya?