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

MySQL Select... untuk pembaruan dengan indeks memiliki masalah konkurensi

Dari sudut pandang teoretis murni, sepertinya Anda tidak mengunci baris yang benar (kondisi berbeda di pernyataan pertama daripada di pernyataan pembaruan; selain itu Anda hanya mengunci satu baris karena LIMIT 1 , sedangkan Anda mungkin memperbarui lebih banyak baris nanti).

Coba ini:

START TRANSACTION;
SELECT v_id FROM v_ext WHERE username IS NULL AND v_id=yyy FOR UPDATE;
UPDATE v_ext SET username=xxx WHERE v_id=yyy;
COMMIT;

[sunting]

Adapun alasan kebuntuan Anda, ini adalah kemungkinan jawaban (dari manual ):

Tanpa indeks, SELECT ... FOR UPDATE pernyataan cenderung mengunci seluruh tabel, sedangkan dengan indeks, hanya mengunci beberapa baris. Karena Anda tidak mengunci baris kanan di pernyataan pertama, kunci tambahan diperoleh selama pernyataan kedua.

Jelas, kebuntuan tidak dapat terjadi jika seluruh tabel terkunci (yaitu tanpa indeks). Kebuntuan pasti dapat terjadi pada penyiapan kedua.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. mysql - Bandingkan nilai dari string untuk tanggal=n dengan tanggal=n-1

  2. Bagaimana cara menggunakan LINQ dengan MySQL dengan benar?

  3. Membalikkan efek `mysqli_real_escape_string`

  4. Paket tidak sesuai pesanan saat memanggil MySQL stored proc

  5. Tambahkan indeks FULLTEXT di Doctrine 2 menggunakan anotasi?